2010-02-16 21 views
11

Honestamente, no tengo idea de por qué sucede esto. Verifiqué, verifiqué dos veces y comprobé tres veces las llaves, los puntos y comas, los constructores movidos, etc. y todavía me da este error.Constructor esperado, destructor o conversión de tipo antes del token '*'

El código relevante a continuación.

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 

Y 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

sería útil si (a) copió en el mensaje de error completo (b), se indica en qué parte del código que produce y (c), que el compilador de la plataforma que' re usando –

+0

Debe mencionarse que sus guardias de inclusión no son seguras. Un nombre que comienza con un guión bajo en lugar de una letra mayúscula está reservado para el compilador. Debería hacer algo como cambiar '_BINTREE_H' a' BINTREE_H' – GManNickG

Respuesta

21

Debido a que en la línea:

Node* BinTree::make(float d) 

el tipo Node es miembro de class BinTree.

Que sea:

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

Caray, NO sabía que tenía que hacer eso. ¡Muchas gracias por aclarar eso! – Freezerburn

+2

Es complicado. Curiosamente, NO es necesario que califique * los parámetros * con 'BinTree ::' - solo los tipos de devolución. –

+1

@j_random_hacker: la parameter-declaration-clause (y todo lo que forma parte de una definición de función después del identificador que nombra la función) está en el 'alcance potencial de una declaración' para una 'definición de clase' (3.3.6/5 " Alcance de la clase "). En otras palabras, todos los miembros de una clase están en el alcance de las definiciones de funciones miembro * después de * el nombre de la función. Entonces, el tipo de devolución no obtiene el beneficio de estar dentro del alcance de clase; llega muy temprano C++ 0x tiene una nueva sintaxis de tipo * return-return-type * que le permite evitar esto, pero en realidad se agrega para deducir los tipos de devolución en las plantillas. –

Cuestiones relacionadas