Как получить этот шаблон класса для компиляции?

0

Извините, я не мог задать вопрос, который мог бы правильно отразить мою проблему. Моя проблема в этом.

У меня есть шаблонный класс. Я не могу понять, как точно определить функцию Get.

template<class Data>
class Class
{
    struct S
    {
    };
    void Do();
    S Get();
};

template<class Data>
void Class<Data>::Do()
{
}

template<class Data>
Class<Data>::S Class<Data>::Get()
{
}

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

1>error C2143: syntax error : missing ';' before 'Class<Data>::Get'
1>error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>fatal error C1903: unable to recover from previous error(s); stopping compilation
  • 5
    Более приятный компилятор печатает: «error: need« typename »перед« Class <Data> :: S », потому что« Class <Data> »является зависимой областью действия»
  • 0
    struct Class <Data> :: S Class <Data> :: Get () {}
Показать ещё 3 комментария
Теги:
templates

2 ответа

3
Лучший ответ
template<class Data>
Class<Data>::S Class<Data>::Get()

должно быть

template<class Data>
typename Class<Data>::S Class<Data>::Get()

потому что S является зависимым типом. Каждый раз, когда у вас есть тип, вложенный в шаблон, вам нужно использовать ключевое слово typename. Например, итератор над vector<int> имеет тип typename vector<int>::iterator.

  • 0
    typename vector<int>::iterator : ключевое слово typename возможно, но не обязательно в этом случае (в C ++ 11). В C ++ 03 невозможно использовать ключевое слово typename вне шаблонов (даже при полной специализации).
0

Стиль С++ 11, который легче читать и писать:

template<class Data>
auto Class<Data>::Get() -> S {
    return {};
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню