Question

Je développe C ++ sur Netbeans 7.1 sur Ubuntu 11.04. Je me demandais si quelqu'un pouvait me dire pourquoi Stack fs (5); est considérée comme une référence non définie à la `Stack :: Stack (int). Pourquoi est-il pas considéré comme une classe avec flotteur utilisé pour 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;
}

Merci, Peter.

Était-ce utile?

La solution

Je ne vois pas le code réel pour nulle part de Stack<float>::Stack(int). Vous avez déclaré, mais il n'y a pas de définition. Donc, il n'existe pas réellement (même si vous dites que ce fait, le compilateur souvent juste prend votre parole), et l'éditeur de liens ne sera pas capable de le trouver, si elle est encore loin

Vous devez soit définir la fonction de la même façon dont vous avez défini ~Stack(), ou ont ailleurs dans le code de la même manière que vous auriez une autre fonction membre.

Autres conseils

Pour utiliser le modèle de classe, vous devez les définir, seule déclaration ne suffit pas. Ce que le compilateur n'est quand est de trouver une véritable utilisation du modèle de classe, par exemple Stack<int>, il a mis int pour remplacer T dans la définition de modèle de classe et de générer une classe pour elle. Quand il voit Stack<double>, il génère une autre base de type sur votre modèle de classe, ces types générés sont appelés classe modèle.

Par ailleurs, Comment puis-je utiliser le c ++ grammaire < "int"> (ignorer « ) int la réponse, il disparaît tout simplement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top