Извините, я не мог задать вопрос, который мог бы правильно отразить мою проблему. Моя проблема в этом.
У меня есть шаблонный класс. Я не могу понять, как точно определить функцию 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
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
.
typename vector<int>::iterator
: ключевое слово typename
возможно, но не обязательно в этом случае (в C ++ 11). В C ++ 03 невозможно использовать ключевое слово typename
вне шаблонов (даже при полной специализации).
Стиль С++ 11, который легче читать и писать:
template<class Data>
auto Class<Data>::Get() -> S {
return {};
}