"используется без параметров шаблона" - программирование
Подтвердить что ты не робот

"используется без параметров шаблона"

Я понимаю, что подобные вопросы были заданы раньше, но я прочитал пару из них и до сих пор не вижу, где я ошибаюсь. Когда я просто пишу свой класс, не отделяя прототип от определения, все работает нормально. Проблема возникает, когда я отделяю прототип и определение, как показано ниже:

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();

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

4b9b3361

Ответ 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 здесь.