Domanda

Sto sviluppando C ++ su NetBeans 7.1 su Ubuntu 11.04. Mi chiedevo se qualcuno potesse dirmi perché stack FS (5); è visto come un riferimento indefinito a `stack :: stack (int) '. Perché non è visto come una classe con galleggiante usato per T?

#include <iostream>

using namespace std ;

template <class T>
class Stack
{
public:
    Stack(int = 10) ;
    ~Stack() { delete [] stackPtr ; }
    int method1(const T&); 
    int method2(T&) ;  
    int method3()const { return top == -1 ; }
    int method4() const { return top == size - 1 ; }
private:
    int attribute1 ;  
    int attribute2 ;
    T* stackPtr ;
} ;


using namespace std; 
int main()
{
    // This line gives the error message "undefined reference to `Stack<float>::Stack(int)'"
    Stack<float> fs(5);

    return 0;
}

Grazie, Peter.

È stato utile?

Soluzione

Non vedo il codice reale per Stack<float>::Stack(int) ovunque. L'hai dichiarato, ma non c'è definizione. Quindi in realtà non esiste (anche se lo stai dicendo; il compilatore spesso prende la tua parola per questo), e il linker non sarà in grado di trovarlo, se si arriva così lontano.

Devi definire la funzione in modo simile a come hai definito ~Stack(), o avere altrove nel codice nello stesso modo in cui avresti qualsiasi altra funzione membro.

Altri suggerimenti

Per utilizzare il modello di classe, è necessario definirli, solo la dichiarazione non è sufficiente. Quello che fa il compilatore è quando trovare un vero utilizzo del modello di classe, diciamo Stack<int>, ha messo int per sostituire T nella definizione del modello di classe e generare una classe per essa. Quando vede Stack<double>, Genera un'altra base di tipo sul modello di classe, questi tipi generati sono chiamati classe modello.

A proposito, come posso usare la grammatica C ++ <"int"> (ignora ") int la risposta, scompare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top