2010-02-16 7 views
11

Honnêtement, je n'ai aucune idée de pourquoi cela se produit. J'ai vérifié, revérifié, vérifié trois fois les accolades, les points-virgules, les constructeurs déplacés, etc. et cela me donne toujours cette erreur.Constructeur attendu, destructeur, ou conversion de type avant le jeton '*'

Le code correspondant suit.

BinTree.h

#ifndef _BINTREE_H 
#define _BINTREE_H 

class BinTree 
{ 
private: 
    struct Node 
    { 
     float data; 
     Node *n[2]; 
    }; 
    Node *r; 

    Node* make(float); 

public: 
    BinTree(); 
    BinTree(float); 
    ~BinTree(); 

    void add(float); 
    void remove(float); 

    bool has(float); 
    Node* find(float); 
}; 

#endif 

Et BinTree.cpp

#include "BinTree.h" 

BinTree::BinTree() 
{ 
    r = make(-1); 
} 

Node* BinTree::make(float d) 
{ 
    Node* t = new Node; 
    t->data = d; 
    t->n[0] = NULL; 
    t->n[1] = NULL; 
    return t; 
} 
+2

Il serait utile si vous (a) copié dans le message d'erreur complète, (b) indiqué où dans le code, il se produit et (c) qui compilateur sur quelle plate-forme vous » re en utilisant. –

+0

Il convient de mentionner que vos gardes d'inclusion ne sont pas sécuritaires. Un nom commençant par un trait de soulignement par rapport à une lettre majuscule est réservé au compilateur. Vous devriez faire quelque chose comme le changement '_BINTREE_H' à' BINTREE_H' – GManNickG

Répondre

21

Parce que sur la ligne:

Node* BinTree::make(float d) 

le type Node est membre de class BinTree.

Faire:

BinTree::Node* BinTree::make(float d) 
+0

Geez, ne savais pas que vous deviez faire cela. Merci beaucoup d'avoir éclairci ça pour moi! – Freezerburn

+2

C'est difficile. Il est intéressant de noter que vous n'avez PAS à qualifier * paramètres * avec les types de retour 'BinTree ::' -. –

+1

@j_random_hacker: la clause de déclaration de paramètre (et tout ce qui fait partie d'une définition de fonction après l'identifiant qui nomme la fonction) est dans la 'portée potentielle d'une déclaration' pour une 'définition de classe' (3.3.6/5 " Portée de classe "). En d'autres termes, tous les membres d'une classe sont concernés par les définitions de fonction de membre * après * le nom de la fonction. Donc, le type de retour n'a pas l'avantage d'être dans la portée de la classe; ça vient trop tôt. C++ 0x a une nouvelle syntaxe * trailing-return-type * qui vous permet de contourner ce problème, mais elle est vraiment ajoutée pour déduire les types de retour dans les templates. –

Questions connexes