error: solicitud de miembro ‘..’ en ‘..’ que es de tipo no de clase

Tengo una clase con dos constructores, uno que no toma argumentos y otro que toma un argumento.

Crear objetos usando el constructor que toma un argumento funciona como se espera. Sin embargo, si creo objetos usando el constructor que no toma argumentos, aparece un error.

Por ejemplo, si compilo este código (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; } 

… Obtuve el siguiente error:

 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 ()()' 

¿Por qué es esto y cómo lo hago funcionar?

 Foo foo2(); 

cambiar a

 Foo foo2; 

Obtienes el error porque el comstackdor piensa en

 Foo foo2() 

a partir de la statement de función con el nombre ‘foo2’ y el tipo de retorno ‘Foo’.

Pero en ese caso Si cambiamos a Foo foo2 , el comstackdor podría mostrar el error " call of overloaded 'Foo()' is ambiguous" .

Para que conste..

En realidad, no es una solución para su código, pero tuve el mismo mensaje de error cuando myPointerToClass incorrectamente al método de una instancia de clase apuntada por myPointerToClass , por ejemplo

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

dónde

 myPointerToClass->aMethodOfThatClass(); 

obviamente sería correcto

Añadiendo a la base de conocimiento, obtuve el mismo error para

 if(class_iter->num == *int_iter) 

Aunque el IDE me dio los miembros correctos para class_iter. Obviamente, el problema es que "anything"::iterator no tiene un miembro llamado num entonces necesito desreferenciarlo. Lo cual no funciona así:

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

…aparentemente. Finalmente lo resolví con esto:

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

Espero que esto ayude a alguien que se encuentre con esta pregunta de la manera en que lo hice.

Estaba teniendo un error similar, parece que el comstackdor entiende mal la llamada al constructor sin argumentos. Lo hice funcionar quitando el paréntesis de la statement de variable, en su código algo como esto:

 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; } 

No se requiere el paréntesis para instanciar un objeto de clase cuando no tiene la intención de usar un constructor parametrizado.

Solo usa Foo foo2;

Funcionará.

Me encontré con un caso donde recibí ese mensaje de error y tuve

 Foo foo(Bar()); 

y básicamente estaba tratando de pasar un objeto Bar temporal al constructor Foo. Resulta que el comstackdor estaba traduciendo esto a

 Foo foo(Bar(*)()); 

es decir, una statement de función cuyo nombre es foo que devuelve un Foo que toma un argumento, un puntero de función que devuelve una barra con 0 argumentos. Al pasar en temporarios como este, mejor utilizar Bar{} lugar de Bar() para eliminar la ambigüedad.

Si desea declarar una nueva sustancia sin ningún parámetro (sabiendo que el objeto tiene parámetros predeterminados) no escriba

  type substance1(); 

pero

  type substance; 

Ciertamente, un caso de esquina para este error, pero lo recibí en una situación diferente, al intentar sobrecargar el operator= asignación operator= . Era un IMO un tanto críptico (de 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; } 

Recibí 2 errores “idénticos”

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

(El error equivalente para clang es: error: member reference base type 'float' is not a structure or union )

para las líneas data.i = data; y data.f = data; . Resulta que el comstackdor confundía el nombre de la variable local ‘datos’ y mis data variables miembro. Cuando cambié esto a void operator=(T newData) y data.i = newData; , data.f = newData; , el error desapareció

Agregando mi error, lo he intentado:

Foo.low[i]

En lugar de:

Foo[i].low