Шаблон функции: объявление typename - PullRequest
0 голосов
/ 20 апреля 2011

На GCC, следующее дает мне ошибку: no type named 'x' in 'struct Type'

На VC ++, он жалуется на то, что p не объявлен

struct Type
{
   static int const x = 0;
};

template <class T> void Func()
{
   typename T::x * p; // p to be pointer
}

int main()
{
   Func<Type>();
}

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

T::x становится Type::x, что является int, а не типом.

Вы сказали компилятору, что T::x называет тип с помощью typename.Когда создается экземпляр Func<Type>, T::x не является типом, поэтому компилятор сообщает об ошибке.

0 голосов
/ 07 августа 2015

В C ++ 11 ключевое слово using может использоваться для псевдонима типа

struct Type
{
    using x = static int const;
};
0 голосов
/ 20 апреля 2011

Поскольку Type::x - это не тип , а значение , поэтому, когда вы пишете typename, вы говорите компилятору найти вложенный тип с именем x внутри Type, но не смог. Следовательно, GCC говорит no type named 'x' in 'struct Type', что более полезно, чем сообщение, генерируемое VC ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...