2010-08-26 7 views
3

je code similaire à celui-ci dans un fichier d'en-tête:C++ variable d'élément de modèle dans la classe sans canevas possède un type incomplet

template<class A> 
class List { 
    private: 
    QVector<A> _list; 
}; 

où QVector est le conteneur standard QT.

Lorsque je tente de faire une variable de type liste en tant que variable membre dans un autre fichier d'en-tête comme ceci:

class Model { 
    private: 
    List<int *> the_list; 
}; 

Je reçois l'erreur suivante:

In instantiation of 'List<int *>': 
instantiated from here 
error: 'List<A>::_list' has incomplete type 

Fondamentalement, je veux un liste personnalisée qui est modélisée et qui utilise un QVector interne pour stocker les éléments de données.

Je suppose que ma syntaxe est un peu éteinte, donc toute aide serait appréciée.

+0

Vous incluez le premier en-tête de la seconde? Cela peut valoir la peine d'exécuter uniquement l'étape du préprocesseur, par ex. "gcc -E" pour vérifier que les choses sont telles qu'elles apparaissent. –

Répondre

5

Assurez-vous que vous avez #include d le fichier d'en-tête pour QVector avant votre déclaration de class List { }. Si vous l'omettez alors QVector est un type indéfini mais comme List est une classe basée sur un modèle, le compilateur n'omit pas un message d'erreur jusqu'à ce que vous instanciez List pour la première fois.

#include <QVector> 

template<class A> 
class List { 
    private: 
    QVector<A> _list; 
}; 
+0

Merci! C'était le problème. Je dois consommer plus de caféine si j'ai passé plusieurs heures sur un #include manquant :). – Aaron

+0

Notez, beaucoup de compilateurs * vont * imprimer une erreur pour cela, et même si QVector a été défini entre cette déclaration et l'instanciation, c'est toujours une erreur. – Potatoswatter

+0

@Potatoswatter, on dirait que 'QVector' a été * forward déclaré *, donc le compilateur n'a pas le droit de commettre d'erreur prématurément sans l'instanciation de' List '. –

Questions connexes