2013-05-03 19 views
6

ho ottenuto questo errore e non sono in grado di risolvere da solorichiesta di membro che è di tipo non-classe

source.cpp:85:8: error: request for member ‘put_tag’ in ‘aux’, which is of non-class type ‘Keyword()’ 
source.cpp:86:8: error: request for member ‘put_site’ in ‘aux’, which is of non-class type ‘Keyword()’ 
make: *** [source.o] Error 1 

il codice che mi dà questo errore è

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

devo ricordare che la parola e il sito sono char * tipo

Ora, la mia definizione di classe di parola chiave è questa:

class Keyword{ 
private: 

std::string tag; 
Stack<std::string> weblist; 

public: 

    Keyword(); 
    ~Keyword(); 
    void put_tag(std::string word) 
    { 
     tag = word; 
    } 
    void put_site(std::string site) 
    { 
     weblist.push(site); 
    } 

}; 

Grazie mille!

Aggiornamento

Modificando

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

in

Keyword aux; 
aux.put_tag(word); 
aux.put_site(site); 

ho ottenuto questo errore:

source.o: In function `Algorithm::indexSite(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': 
source.cpp:(.text+0x2c6): undefined reference to `Keyword::Keyword()' 
source.cpp:(.text+0x369): undefined reference to `Keyword::~Keyword()' 
source.cpp:(.text+0x4a8): undefined reference to `Keyword::~Keyword()' 
source.o: In function `Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)': 
source.cpp:(.text._ZN7Keyword8put_siteESs[Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x2a): undefined reference to `Stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
collect2: ld returned 1 exit status 
make: *** [tema3] Error 1 
+2

Leggi [l'analisi più irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+0

@JoachimPileborg Non è proprio la stessa cosa? L'errore dell'OP era più semplice di quello nell'articolo collegato a. – john

+1

@john: Infatti. Tecnicamente, questo non è MVP, perché non c'è ambiguità. Questo non può essere interpretato come la dichiarazione di un oggetto. –

risposta

15

Questa linea non fa quello che pensi:

0.123.
Keyword aux(); 

sta dichiarando una funzione chiamato aux che non accetta argomenti e restituisce un Keyword. Molto probabilmente dire di scrivere (senza le parentesi):

Keyword aux; 

che dichiara un oggetto di tipo Keyword.

UPDATE:

Per quanto riguarda l'errore successivo hai trovato, questo è perché avete un dichiarazione del costruttore e distruttore della classe, ma non una definizione. In effetti, l'errore che si ottiene proviene dal linker e non dal compilatore.

di fornire una definizione banale del costruttore e distruttore, cambiare questo:

Keyword(); 
~Keyword(); 

In questa:

Keyword() { } 
~Keyword() { } 

Oppure, a patto che queste funzioni membro non fanno nulla, basta omettere a tutto - il compilatore le genererà per te (a meno che tu non aggiunga qualche altro costruttore dichiarato dall'utente, per quanto riguarda il costruttore).

+0

rimuovendo il costruttore e il distruttore o sostituendo con la risposta ottengo ancora lo stesso errore – sniperu

+0

@sniperu: Probabilmente ottieni lo stesso errore per qualcos'altro rispetto al costruttore e al distruttore. Probabilmente c'è qualche altra funzione che hai dimenticato di definire –

+0

@sniperu: In effetti, sembra che manchi la definizione di 'Stack :: push()'. L'hai messo in un file di intestazione? In caso contrario, consultare [questo Q & A] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). –

3

Non questa

Keyword aux(); 
aux.put_tag(word); 
aux.put_site(site); 

ma questo

Keyword aux; 
aux.put_tag(word); 
aux.put_site(site); 

Nella vostra versione Keyword aux(); è un prototipo funzione non una dichiarazione di variabile.

0

Ho avuto lo stesso problema quando digito il seguente codice nella mia funzione principale, ho un file List.h e List.cpp contiene la mia classe List.

List<int,int> myList(); 
bool x=myList.isEmpty(); 

ottengo un errore di "richiesta di membro 'isEmpty' in 'myList', che è di tipo non-class 'Lista()'"

l'errore è perché il compilatore considera myList () come un prototipo di funzione

quando ho corretto il codice da

List<int,int> myList; 
bool x=myList.isEmpty(); 

ho ottenuto l'errore "undefined reference to` List :: Lista()" e un paio di errori simili per il distruttore.

Ulteriore ispezione del mio codice e delle risposte in questa pagina ho scoperto che devo includere il mio file List.cpp nel main.cpp tuttavia ho incluso List.h nel mio file List.cpp ma sembra che questa informazione abbia da dire al file principale pure. ulteriore lettura per this tutorial spiega perché, se compilo il progetto senza includere List.cpp, verrà compilato correttamente perché il file List.h ha il prototipo ma fallirebbe nella fase del linker perché il linker non sarebbe in grado di risolvere la chiamata a List() per una funzione specifica.

Problemi correlati