Компиляция ошибки в методе шаблона, return - экземпляр из внутреннего класса

Вот упрощенный пример:

template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }

Я получаю следующую ошибку компиляции:

expected constructor, destructor, or type conversion before 'met'

Я использую GCC. Кажется, компилятор не распознает MyTemplate<T>::Inner как правильный класс. Как я могу это исправить? Я пробовал придерживаться ключевого слова typename здесь и там безрезультатно. Прямо сейчас, единственный способ, которым я могу скомпилировать это, - это встроить определение метода в объявление класса, которое я бы хотел избежать.

Ответ 1

Clang сообщает следующее:

error: missing 'typename' prior to dependent type name
'MyTemplate<T>::Inner' MyTemplate<T>::Inner  MyTemplate<T>::met()
^~~~~~~~~~~~~~~~~~~~ typename  1 error generated.

И размещение typename в соответствующем месте исправляет его.

template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
typename MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }

Вы помещали typename в нужное место? Если это так, то это должно быть ошибкой в ​​g++.

Ответ 2

Возвращаемый тип MyTemplate::met является зависимым именем, поэтому перед ним нужно добавить ключевое слово typename. Следующие компиляции на gcc-4.5.1

template<typename T>
struct MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
typename MyTemplate<T>::Inner  MyTemplate<T>::met()
{
  return typename MyTemplate<T>::Inner();
}

int main()
{
  MyTemplate<int> foo;

  MyTemplate<int>::Inner bar = foo.met();
}

Ответ 3

Вам нужно добавить ключевое слово typename до MyTemplate<T>::Inner, потому что MyTemplate<T> - зависимая область.