2010-02-16 8 views
11

Onestamente non ho idea del motivo per cui questo sta accadendo. Ho controllato, ricontrollato e controllato tre volte parentesi graffe, punto e virgola, spostato i costruttori, ecc. E mi dà ancora questo errore.Conversione prevista del costruttore, del distruttore o del tipo prima del token '*'

Segue il codice pertinente.

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 

E 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

Sarebbe utile se (a) copiato nel messaggio di errore completo, (b) indicato dove nel codice si verifica e (c), che il compilatore su quale piattaforma si' usando. –

+0

Va detto che le tue guardie incluse non sono al sicuro. Un nome che inizia con un carattere di sottolineatura rispetto a una lettera maiuscola è riservato al compilatore. Dovresti fare qualcosa come cambiare '_BINTREE_H' in' BINTREE_H' – GManNickG

risposta

21

Perché sulla linea:

Node* BinTree::make(float d) 

tipo Node è un membro della class BinTree.

Make it:

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

Geez, NON lo sapevi che dovevi farlo. Mille grazie per averlo chiarito! – Freezerburn

+2

È difficile. È interessante notare che NON è necessario qualificare * parametri * con 'BinTree ::' - solo i tipi restituiti. –

+1

@j_random_hacker: la clausola-dichiarazione-parametro (e tutto ciò che fa parte di una definizione di funzione dopo l'identificatore che denomina la funzione) si trova nell '"ambito potenziale di una dichiarazione" per una "definizione di classe" (3.3.6/5 " Ambito di classe "). In altre parole, tutti i membri di una classe rientrano nelle definizioni delle funzioni membro * dopo * il nome della funzione. Quindi il tipo di ritorno non ha il vantaggio di essere in ambito di classe; arriva troppo presto. C++ 0x ha una nuova sintassi * trailing-return-type * che ti consente di ovviare a questo problema, ma viene realmente aggiunta per dedurre i tipi di ritorno nei template. –

Problemi correlati