08 августа 2008

Typedefs

Кстати, о typedef-ах. Typedef не создает новый тип - только его псевдоним. В этом можно убедиться на простом примере:
template <typename T> class foo {};
template <> class foo<char> {};
typedef char bar;
template <> class foo<bar> {} // compile error
В последней строке получим ошибку, говорящую нам что шаблон foo для типа char уже определен.

Кстати, на счет типов. Как думаете, что выдаст следующий код:
template <typename T> struct foo { static const int x = 1; };
template <> struct foo<signed char> { static const int x = 2; };
template <> struct foo<unsigned char> { static const int x = 3; };
cout << foo<char>::x;
Единицу. Char, signed char и unsigned char - три разных типа. В зависимости от настроек компилятора char ведет себя как signed или unsigned, но это отдельный тип.

4 комментария:

Анонимный комментирует...

за char спасибо, однажды я встречался с непонятным поведением программы в которой были различные char'ы.

Pilgrim комментирует...

спасибо, буду знать

Unknown комментирует...

оно то конечно уже полгода прошло :)
но в строке

template <> class foo<bar > {} // compile error

надо б точку с запятой после фигурной скобки поставить.

Raider комментирует...

spk: ну так там же написано "compile error". Точка с запятой не стоит - вот и compile error ;-)))