"используется без параметров шаблона"
Я понимаю, что подобные вопросы были заданы раньше, но я прочитал пару из них и до сих пор не вижу, где я ошибаюсь. Когда я просто пишу свой класс, не отделяя прототип от определения, все работает нормально. Проблема возникает, когда я отделяю прототип и определение, как показано ниже:
template<class T> class VisitedSet {
public:
VisitedSet();
int getSize();
void addSolution(const T& soln);
void evaluate();
private:
vector<T> vec;
int iteration;
};
И как пример определения, которое дает мне эту ошибку:
int VisitedSet::getSize() {
return vec.size();
Я никогда раньше не делал шаблонный класс, поэтому, пожалуйста, простите меня, если проблема здесь тривиальна.
Ответы
Ответ 1
VisitedSet
- это шаблон, а не класс, поэтому вы не можете использовать VisitedSet
в вложенном спецификаторе имен, например VisitedSet::getSize()
. Так же, как вы указали объявление class VisitedSet<T>
для всех class T
, вы должны указать определение VisitedSet<T>::getSize()
для всех class T
:
template<class T>
int VisitedSet<T>::getSize() {
// ^^^
return vec.size();
}
Однако имя шаблона можно использовать, как если бы это был класс в определении шаблона:
template<class T>
struct Example {
Example* parent;
T x, y;
};
В этом случае Example
является коротким для Example<T>
.
Ответ 2
Вы хотите:
template <class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
Ответ 3
Вы также должны указать параметр шаблона в определении
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
иначе компилятор не сможет сопоставить его с объявлением. Например, для некоторых типов параметров могут быть специализации.
Ответ 4
Вы должны сообщить своему компилятору, что вы реализуете метод в функции шаблона:
template<typename T>
int VisitedSet<T>::getSize() {
return vec.size();
}
Ответ 5
Попробуйте поставить
template <typename T>
выше реализации VisitSet:: getSize() - но будьте осторожны, что в целом шаблонные классы и функции должны быть встроены. Для получения дополнительной информации см. С++ faq здесь.