errore: richiesta per il membro ‘..’ in ‘..’ che è di tipo non di class

Ho una class con due costruttori, uno che non accetta argomenti e uno che accetta un argomento.

La creazione di oggetti mediante il costruttore che accetta un argomento funziona come previsto. Tuttavia, se creo oggetti utilizzando il costruttore che non accetta argomenti, viene visualizzato un errore.

Ad esempio, se compilo questo codice (usando g ++ 4.0.1) …

class Foo { public: Foo() {}; Foo(int a) {}; void bar() {}; }; int main() { // this works... Foo foo1(1); foo1.bar(); // this does not... Foo foo2(); foo2.bar(); return 0; } 

… ottengo il seguente errore:

 nonclass.cpp: In function 'int main(int, const char**)': nonclass.cpp:17: error: request for member 'bar' in 'foo2', which is of non-class type 'Foo ()()' 

Perché è questo e come lo faccio funzionare?

 Foo foo2(); 

cambiare a

 Foo foo2; 

Si ottiene l’errore perché il compilatore pensa

 Foo foo2() 

a partire dalla dichiarazione di funzione con nome ‘foo2’ e il tipo di ritorno ‘Foo’.

Ma in tal caso Se passiamo a Foo foo2 , il compilatore potrebbe mostrare l’errore " call of overloaded 'Foo()' is ambiguous" .

Solo per la cronaca..

In realtà non è una soluzione al tuo codice, ma ho avuto lo stesso messaggio di errore quando myPointerToClass modo errato al metodo di un’istanza di class puntata da myPointerToClass , ad es.

 MyClass* myPointerToClass = new MyClass(); myPointerToClass.aMethodOfThatClass(); 

dove

 myPointerToClass->aMethodOfThatClass(); 

ovviamente sarebbe corretto

Aggiungendo alla base di conoscenza, ho ottenuto lo stesso errore per

 if(class_iter->num == *int_iter) 

Anche se l’IDE mi ha dato i membri corretti per class_iter. Ovviamente, il problema è che "anything"::iterator non ha un membro chiamato num quindi ho bisogno di dereferenziarlo. Quale non funziona in questo modo:

 if(*class_iter->num == *int_iter) 

…apparentemente. Alla fine l’ho risolto con questo:

 if((*class_iter)->num == *int_iter) 

Spero che questo aiuti qualcuno che attraversa questa domanda come ho fatto io.

Stavo avendo un errore simile, sembra che il compilatore fraintenda la chiamata al costruttore senza argomenti. L’ho fatto rimuovendo la parentesi dalla dichiarazione delle variabili, nel tuo codice qualcosa del genere:

 class Foo { public: Foo() {}; Foo(int a) {}; void bar() {}; }; int main() { // this works... Foo foo1(1); foo1.bar(); // this does not... Foo foo2; // Without "()" foo2.bar(); return 0; } 

Le parentesi non sono richieste per creare un’istanza di un object di class quando non si intende utilizzare un costruttore parametrizzato.

Basta usare Foo foo2;

Funzionerà.

Mi sono imbattuto in un caso in cui ho ricevuto quel messaggio di errore e ho avuto

 Foo foo(Bar()); 

e cercava fondamentalmente di passare in un object Bar temporaneo al costruttore Foo. Risulta che il compilatore stava traducendo questo in

 Foo foo(Bar(*)()); 

cioè, una dichiarazione di funzione il cui nome è foo che restituisce un Foo che accetta un argomento – un puntatore di funzione che restituisce una Barra con 0 argomenti. Quando si passa in provvisori come questo, meglio usare Bar{} invece di Bar() per eliminare l’ambiguità.

Se si desidera dichiarare una nuova sostanza senza parametri (sapendo che l’object ha parametri predefiniti) non scrivere

  type substance1(); 

ma

  type substance; 

Certamente un caso angolo per questo errore, ma l’ho ricevuto in una situazione diversa, quando si tenta di sovraccaricare l’ operator= assegnazione operator= . Era un IMO un po ‘criptico (da g ++ 8.1.1).

 #include  enum DataType { DT_INT32, DT_FLOAT }; struct PrimitiveData { union MyData { int32_t i; float f; } data; enum DataType dt; template void operator=(T data) { switch(dt) { case DT_INT32: { data.i = data; break; } case DT_FLOAT: { data.f = data; break; } default: { break; } } } }; int main() { struct PrimitiveData pd; pd.dt = DT_FLOAT; pd = 3.4f; return 0; } 

Ho ricevuto 2 errori “identici”

 error: request for member 'i' [and 'f'] in 'data', which is of non-class type 'float' 

(L’errore equivalente per clang è: error: member reference base type 'float' is not a structure or union )

per le righe data.i = data; e data.f = data; . Risulta che il compilatore confondeva i nomi delle variabili locali “data” e i miei data variabili membri. Quando ho cambiato questo a void operator=(T newData) e data.i = newData; , data.f = newData; , l’errore è andato via.

Aggiungendo il mio errore, ho provato:

Foo.low[i]

Invece di:

Foo[i].low