Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

Проблема с typedef.... не виден новый тип данных! - C++

29.11.2011, 15:16. Просмотров 2562. Ответов 62
Метки нет (Все метки)

Пишу шаблон класса множество, у множеств элементы могут быть разного типа, одно, например, целочисленное, другое - строка.
Пользователю дается возможность выбрать тип, с которым ему работать.
Тип выбирается через функцию MenuType() и через свитч конкретизируется... но сразу за границей свича новый тип данных становится недоступным.
Как решить эту проблему?

вот фрагмент кода, в котором все и происходит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
switch (MenuType()) 
        {
            case 1: typedef string Type; break;
            case 2: typedef char Type;break;
            case 3: typedef int Type;break;
            case 4: typedef double Type;break;
            case 5: don=true;
        }
        
        //здесь Type уже не виден!
        Set_list<Type> A("SetA"),B("SetB"),C("SetC"),D("SetD");
        Set_list<Type>* pSet[] = { &A, &B, &C, &D };
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2011, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с typedef.... не виден новый тип данных! (C++):

Новый тип данных - C++
есть ли возможность самому создать новый тип данных, на основе старых, который будет в два-три раза длиннее обычных. unsigned long int -&gt;...

тип typedef - C++
можете кинуть какую нибудь программу с преобразованием типа typedef (С++), очень срочно нужно..

Проблема с define и typedef - C++
Объясните мне пожалуйста, товарищи... В чем смысл объявлять такие дурацкие дефайны кто это делает? и таких бессмысленных дефайнов, просто...

Проблема с typedef и FILE* - C++
здравствуйте, пишу typedef FILE* File; выдает ошибку на компиляции.. похоже проблема с файлом..потому что тайпдеф для других...

Новый тип данных в объявлении метода класса - C++
Здравствуйте, подскажите, пожалуйста, как сделать, чтобы метод класса мог принимать как аргумент массив, тип данных которого был определен...

Функциональный тип через typedef - C++
Приветствую, нужна помощь в решении задачи: В файле заданы строки из 5-ти чисел: границы отрезка, точность, номер функции и номер...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
oxotnik
1589 / 1066 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
29.11.2011, 15:17 #2
за скобки вынести, не?
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:18  [ТС] #3
что за скобки вынести?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
29.11.2011, 15:20 #4
Fantom.AS, Нельзя так делать.
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:22  [ТС] #5
Но как мне тогда сделать?
Если тип на этапе компиляции неизвестен?
Не вставлять же каждый раз код и менять с int на double, с double на char?
Сыроежка
Заблокирован
29.11.2011, 15:32 #6
Fantom.AS,

У вас в коде тип T объявляется локальным по отношению к блоку кода switch

Как ни странно, но у меня в MS VC++ 2010 прошел следующей код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include  <iostream>
 
template <typename T>
void type()
{
    std::cout << typeid( T ).name() << std::endl;
}
 
int main()
{
 
    int i = 1;
 
    if ( i == 0 ) typedef int T;
    if ( i == 1 ) typedef char T;
 
    type<T>();
}

Я извиняюсь, но сразу же не заметил, что этот код некорректный! Дело в том, что в этом коде переопределяется тип T с помощью typedef, а это некорректно. В стандарте говорится, что компилятор не обязан делать предупреждения, что это переопредеение некорректно. Поэтому компилятор в данном случае принимает во внимание последнее определение typedef То есть даже если i = 0, значением T все равно будет char.

Так что с typedef у вас ничего не получится!
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:35  [ТС] #7
C++
1
2
3
4
5
template <typename T>
void type()
{
        std::cout << typeid( T ).name() << std::endl;
}
- это функция - метод класса? Я пока не очень понял Ваш способ....
Bers
Заблокирован
29.11.2011, 15:40 #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Как ни странно, но у меня в MS VC++ 2010 прошел следующей код.
Я проверил:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename T>
void type()
{
    std::cout << typeid( T ).name() << std::endl;
}
 
 
int main()
{
    STD;
 
    CKDice md;
    int i = md.GetRandom(0,1);
    cout<<"i="<<i<<endl;
 
    if ( i == 0 ) typedef int T;
    if ( i == 1 ) typedef char T;
 
    type<T>(); //вывод: char независимо от того, чему равно i
     
    EndProgramm();
}
Сыроежка
Заблокирован
29.11.2011, 15:42 #9
Цитата Сообщение от Fantom.AS Посмотреть сообщение
template <typename T>
C++
1
2
3
4
void type()
{
        std::cout << typeid( T ).name() << std::endl;
}
- это функция - метод класса? Я пока не очень понял Ваш способ....
Я для предыдущего сообщения сделал дополнение. Так что я вас разочарую, но за идею вам следует поставить оценку отлично!

Что касается данного вашего вопроса. то это просто некая глобальная функция, которая ничего не делает кроме того, что выводит имя типа, заданного в качестве шаблонного аргумента функции.
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:45  [ТС] #10
Я через if тоже пробовал, не работает...
Bers
Заблокирован
29.11.2011, 15:47 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <typename T>
void type()
{
    std::cout << typeid( T ).name() << std::endl;
}
 
 
int main()
{
    STD;
 
    int i=0;
 
    if ( i == 0 ) typedef int T;
    if ( i == 1 ) typedef char T;
 
    type<T>(); //вывод: char
     
    EndProgramm();
}
*кастует Сыроежку*

Есть подозрение, что тайпдефы обрабатываются препроцессором, и не зависят от управляющий логики самого с++

Какой последний тайпдеф был задекларирован, тот и будит участвовать в рантайме
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:50  [ТС] #12
мда.... как же мне тогда выйти из сложившейся ситуации?
Сыроежка
Заблокирован
29.11.2011, 15:50 #13
Цитата Сообщение от Bers Посмотреть сообщение
Есть подозрение, что тайпдефы обрабатываются препроцессором, и не зависят от управляющий логики самого с++

Какой последний тафдеп был задекларирован, тот и будит участвовать в рантайме
Я же все написал. Имеет место переопределение первого typedef вторым typedef, так как они имеют одну область видимости. Такое переопределение согласно стандарту некорректно. Тем не менее компилятор не обязан об этом говорить программисту. То есть в данном случае поведение неопределенное.
Bers
Заблокирован
29.11.2011, 15:54 #14
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я же все написал
Ну да.. подредактировал самое первое сообщение) Кто б знал об этом)
Ладно.. если поведение не определено, стало быть такими фокусами лучше не пользоваться.

Добавлено через 46 секунд
Цитата Сообщение от Fantom.AS Посмотреть сообщение
мда.... как же мне тогда выйти из сложившейся ситуации?
Меняйте архитектурное решение полностью
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:55  [ТС] #15
я бы поменял, но вчера задали так задание.... вот маюсь теперь....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 15:55
Привет! Вот еще темы с ответами:

Заголовочный файл подключен, но не виден тип - C++
Работаю в QT. Выдает ошибку does not name a type, как будто нет такого типа. У меня 2 класса и в каждом указатель на другой. Подключаю...

Как объявить указатель на массив через typedef и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

Определён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? - C++
Определеён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? Или как?

Enum и типы данных. Как задать тип значений явно, и какой тип будет при переполнении? - C++
Пытаюсь сделать функцию с передачей нескольких параметров,используя битовые операции. В качестве параметров думаю использовать не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.11.2011, 15:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru