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 esperaba. Sin embargo, si creo objetos usando el constructor que no toma argumentos, me sale 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?
Respuestas:
cambiar a
Obtiene el error porque el compilador piensa en
a partir de la declaración de función con el nombre 'foo2' y el tipo de retorno 'Foo'.
Pero en ese caso, si cambiamos a
Foo foo2
, el compilador podría mostrar el error" call of overloaded ‘Foo()’ is ambiguous"
.fuente
Para que conste..
En realidad, no es una solución a su código, pero recibí el mismo mensaje de error cuando accedí incorrectamente al método de una instancia de clase señalado por
myPointerToClass
, por ejemplo,dónde
obviamente sería correcto
fuente
Agregando a la base de conocimiento, obtuve el mismo error para
Aunque el IDE me dio los miembros correctos para class_iter. Obviamente, el problema es que
"anything"::iterator
no tiene un miembro llamado,num
así que necesito desreferenciarlo. Lo que no funciona así:...aparentemente. Finalmente lo resolví con esto:
Espero que esto ayude a alguien que se encuentre con esta pregunta como lo hice yo.
fuente
No se requiere paréntesis para crear una instancia de un objeto de clase cuando no tiene la intención de utilizar un constructor parametrizado.
Solo usa Foo foo2;
Funcionará.
fuente
Estaba teniendo un error similar, parece que el compilador no entiende la llamada al constructor sin argumentos. Lo hice funcionar eliminando el paréntesis de la declaración de variable, en su código algo como esto:
fuente
[stmt.ambig/1]
y[dcl.ambig.res/1]
, el estándar establece explícitamente que, en caso de ambigüedad, cualquier cosa que pueda interpretarse como una declaración ES una declaración, para resolver esa ambigüedad.)Me encontré con un caso en el que recibí ese mensaje de error y tuve
y básicamente estaba tratando de pasar un objeto Bar temporal al constructor Foo. Resulta que el compilador estaba traduciendo esto a
es decir, una declaración 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 por temporarios como este, es mejor usarlos en
Bar{}
lugar deBar()
eliminar la ambigüedad.fuente
Si desea declarar una nueva sustancia sin parámetro (sabiendo que el objeto tiene parámetros predeterminados) no escriba
pero
fuente
Ciertamente, un caso de esquina para este error, pero lo recibí en una situación diferente, al intentar sobrecargar la asignación
operator=
. Fue un poco críptico IMO (de g ++ 8.1.1).Recibí 2 errores "idénticos"
(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;
ydata.f = data;
. Resulta que el compilador estaba confundiendo el nombre de la variable local 'data' y mi variable miembrodata
. Cuando cambié a estevoid operator=(T newData)
ydata.i = newData;
,data.f = newData;
el error fue.fuente
@MykolaGolubyev ya ha dado una explicación maravillosa. Estaba buscando una solución para hacer algo como esto
MyClass obj ( MyAnotherClass() )
pero el compilador lo interpretaba como una declaración de función.C ++ 11 tiene braced-init-list . Usando esto podemos hacer algo como esto
Sin embargo, esto:
arroja un error de compilación ya que lo considera
t
de tipoTemp(String (*)())
.fuente