webentwicklung-frage-antwort-db.com.de

"wird ohne Vorlagenparameter verwendet"

Mir ist klar, dass ähnliche Fragen schon einmal gestellt wurden, aber ich habe ein paar davon gelesen und sehe immer noch nicht, wo ich falsch liege. Wenn ich einfach meine Klasse schreibe, ohne den Prototyp von der Definition zu trennen, funktioniert alles gut. Das Problem tritt auf, wenn ich den Prototyp und die Definition wie folgt trenne:

template<class T> class VisitedSet { 
public:
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private:
    vector<T> vec;
    int iteration;
};

Und als Beispiel einer Definition, die mir diesen Fehler gibt:

int VisitedSet::getSize() {
    return vec.size();

Ich habe noch nie einen Unterricht mit Vorlagen gemacht, bitte verzeihen Sie, wenn das Problem hier trivial ist.

21
synaptik

VisitedSet ist eine Vorlage, keine Klasse. Sie können VisitedSet nicht in einem geschachtelten Namensspezifizierer wie VisitedSet::getSize() verwenden. So wie Sie die Deklaration von class VisitedSet<T> für alle class T angegeben haben, müssen Sie die Definition von VisitedSet<T>::getSize() für alle class T angeben:

template<class T>
int VisitedSet<T>::getSize() {
//            ^^^
    return vec.size();
}

Der Name einer Vorlage kann jedoch so verwendet werden, als wäre es eine Klasse innerhalb einer Vorlagendefinition:

template<class T>
struct Example {
    Example* parent;
    T x, y;
};

In diesem Fall steht Example für Example<T>.

34
Jon Purdy

Du willst das:

template <class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}
3
chris

Sie müssen den Template-Parameter auch in der Definition angeben

template<class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}

andernfalls kann der Compiler der Deklaration nicht entsprechen. Beispielsweise könnte es für einige Parametertypen Spezialisierungen geben.

2
Bo Persson

Sie müssen Ihrem Compiler mitteilen, dass Sie eine Methode in der Vorlagenfunktion implementieren:

 template<typename T>
 int VisitedSet<T>::getSize() {
    return vec.size();
 }
2
d_inevitable

Versuchen Sie es zu setzen 

template <typename T>

über der Implementierung von VisitedSet :: getSize () - aber beachten Sie, dass generell Klassen und Funktionen mit Vorlagen inline sein sollten. Weitere Informationen finden Sie in der C++ - FAQ hier .

0
ds1848