2010-06-15 9 views
3

Dans un fichier d'en-tête, j'ai avant déclaré deux membres d'un espace de noms:C++: la taille du pointeur inconnue lors de la déclaration avant (erreur C2036)

namespace Foo { 
    struct Odp 
    typedef std::vector<Odp> ODPVEC; 
}; 

class Bar 
{ 
public: 
    Foo::ODPVEC baz; // C2036 
}; 

L'erreur généré par le compilateur est:

error C2036: 'Foo::Odp *': unknown size 

Je suppose qu'il s'agit d'un problème avec la déclaration directe Odp. Comment puis-je contourner cela?

+1

Un point-virgule manquant dans l'espace de noms Foo est une faute de frappe? – nevets1219

+2

Voir aussi la [liste des choses que vous pouvez et ne pouvez pas faire avec une déclaration directe] (http://stackoverflow.com/questions/553682/when-to-use-forward-declaration/553869#553869). –

+0

@ nevets1219 oui c'était une faute de frappe –

Répondre

3

Ne pas renvoyer déclarer Odp. Le compilateur ne sait pas quel est le type de std::vector<Odp>, car Odp n'est pas encore déclaré. Donnez au compilateur une déclaration complète pour cette classe.

+0

Mais que faire si je veux aussi le déclarer ailleurs? –

+0

@Rosarch: Vous pouvez déclarer la classe où vous voulez. Vous ne pouvez le définir qu'une seule fois. Définissez-le quelque part où il peut être inclus partout où vous avez besoin de la définition. –

+0

Oui, mais j'essaie d'éviter d'inclure des fichiers d'en-tête dans d'autres fichiers d'en-tête. –

3

std::vector nécessite la pleine déclaration de type du premier paramètre de modèle, car il stocke des objets en valeur, non par pointeur, et nécessite donc la connaissance de la taille de l'objet. Vous pourriez sortir avec déclaration avant si vous stockez pointeurs dans le vecteur, comme:

class foo; 
typedef std::vector<foo*> foo_ptr_vec; 

Voir the fine documentation pour plus de détails gores.