Есть много других случаев, когда вы обнаруживаете, что эта книга отличается от поведения VC ++. Примерами являются инструменты неоднозначности typename
и template
и привязка неконстантных ссылок к значениям.
В этом случае, конечно, поведение G ++ правильное, как говорится в книге. Попробуйте следующие изменения
typedef enum color_type { RED, GREEN, BLUE } *color_ptr;
template< typename T >
class List {
};
// not really local anymore :)
struct Local { int x; };
int main() {
List< Local > l;
List< color_type > l1;
}
Следующий стандарт C ++ (C ++ 0x) допускает локальные типы в качестве аргументов шаблона.
Обратите внимание, что означает книга с присвоением имени типу с помощью typedef. Это не относится к следующему, поскольку имя A
не называет тип перечисления, а указывает на него тип указателя.
typedef enum { X } *A;
Итак, когда вы используете A
или в своем примере color_ptr
, вы не будете в безопасности. Технически это имя является типом указателя на тип без связи, что не допускается в качестве аргумента шаблона.
Обратите внимание, что вы можете поместить Local
в безымянное пространство имен, чтобы сделать тип локальным для текущей единицы перевода, но при этом иметь тип, приемлемый в качестве аргумента шаблона типа. Таким образом, если вы просто хотите иметь тип «нуля» для чего-то вроде функционального объекта, структура не будет конфликтовать со структурой, определенной в другом файле.
namespace {
// not really local anymore, but "translation unit local" :)
struct Local { int x; };
}