typedef с шаблонами - PullRequest
       15

typedef с шаблонами

4 голосов
/ 20 мая 2011
template<class T> struct A {
    typedef int Int;
    A::Int b; // Line 1 (fails)
    Int c; // Line 2 (compiles)
};

int main(){    
   A<int> x;
   x.c = 13;
}

Ошибка

error: ISO C++ forbids declaration of ‘Int’ with no type
error: extra qualification ‘A<T>::’ on member ‘Int’
error: expected ‘;’ before ‘b’

Строка 1 не работает, но строка 2 компилируется. Почему?

1 Ответ

11 голосов
/ 20 мая 2011

Вам нужно typename

typename A::Int b;

Ключевое слово typename является обязательным, поскольку для ссылки на него используется квалифицированное имя A::Int.

Int c хорошо, потому что в этом случае не используется квалифицированное имя.

14,6 / 6

В определении шаблона класса или в определении члена шаблона класса ключевое слово typename не требуется при ссылке на неквалифицированное имя ранее объявленного члена шаблона класса, который объявляет тип. Ключевое слово typename всегда должно указываться, когда член ссылается на использование квалифицированного имени , даже если квалификатор является просто именем шаблона класса.

...