Компиляция ошибки в методе шаблона, 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>
- зависимая область.