Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.
construcción de objetos/Delantero declaración de la función de ambigüedad
Hola,
No fue sólo por un par de veces que he caído en un estado de construcción de objetos que no entendía, y no fue hasta hoy que noté la ambigüedad que estaba introduciendo. Explicaré cómo reproducirlo y me gustaría saber si hay alguna forma de solucionarlo (C++ 0x permitido). Aquí va.
Supongamos que hay una clase cuyo constructor toma solo un argumento, y este tipo de un argumento es otra clase con un constructor predeterminado. Por ejemplo:
struct ArgType {};
class Class
{
public:
Class(ArgType arg);
};
Si intento de construir un objeto de tipo Class
en la pila, me sale una ambigüedad:
Class c(ArgType()); // is this an object construction or a forward declaration
// of a function "c" returning `Class` and taking a pointer
// to a function returning `ArgType` and taking no arguments
// as argument? (oh yeh, loli haets awkward syntax in teh
// saucecode)
Yo digo que es una construcción de objetos, pero el compilador insiste en que es una declaración hacia adelante dentro del cuerpo de la función. Para usted que todavía no lo consigue, aquí hay un ejemplo totalmente funcional:
#include <iostream>
struct ArgType {};
struct Class {};
ArgType func()
{
std::cout << "func()\n";
return ArgType();
}
int main()
{
Class c(ArgType());
c(func); // prints "func()\n"
}
Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
funcPtr();
return Class();
}
Así que, suficientes ejemplos. Alguien puede ayudarme a resolver esto sin hacer nada demasiado anti-idiomático (soy un desarrollador de bibliotecas, y la gente le gusta las bibliotecas idiomáticas).
- editar
No importa. Este es un engaño de Most vexing parse: why doesn't A a(()); work?.
Gracias, sbi.
Su código se compila para mí con g ++ -, que poco es lo que cree que no debería trabajar? –
No se trata de trabajar o no trabajar. El problema es que solo quería construir un objeto de tipo 'Clase' y pasarle a su constructor un objeto de tipo' ArgType' construido en línea. Pero lo reconoce como una declaración directa. Agregaré el código que quería que funcione pero no puedo, solo un segundo. –
Olvídalo, Neil. Mira la respuesta de sbi, ese es exactamente mi problema. –