He encontrado este extraño caso de código (a continuación) no compila bajo Visual Studio 2008 y produce un "error C2872: 'Ambigüedad': símbolo ambiguo" en la línea 12.VS2008 (+?) Error del compilador con funciones de plantilla y 'using namespace'
Extracción del uso de namespace RequiredNamespace
en la última línea fija el error, pero yo esperaría que poner using namespace
al final de un archivo no debe tener efecto. También se basa en que AnotherFunction
es una función de plantilla, por lo que espero que el compilador esté generando las funciones de plantilla en el ámbito incorrecto o que no restablezca la lista de espacios de nombres que se utilizan antes de hacerlo.
El mismo código se compila en GCC.
Ambos compiladores parecen generar el código para TemplatedFunction
después de la definición using namespace Namespace
, al menos hasta donde puedo decir, al introducir errores y observar el orden en que se envían.
namespace Ambiguity
{
class cSomeClass
{
};
template<class T>
void TemplatedFunction(T a)
{
// this is where the error occurs, the compiler thinks Ambiguity
// might refer to the class in RequiredNamespace below
Ambiguity::cSomeClass();
}
}
namespace RequiredNamespace
{
// without a namespace around this class, the Ambiguity class
// and namespace collide
class Ambiguity
{
};
}
int main()
{
// to force the templated function to be generated
Ambiguity::TemplatedFunction(4);
}
// removing this removes the error, but it shouldn't really do anything
using namespace RequiredNamespace;
Obviamente, esto es un ejemplo manufacturado, pero el original se extrae de un caso real en el que el using namespace
se encuentra en un archivo generado automáticamente producido por código de tercera parte.
¿Esto es un error en el compilador?
¿soy yo o es este un ejemplo realmente difícil de leer, con estos identificadores particulares? –
Preet: no es solo usted. –
¿Cómo puedo hacerlo más simple?Supongo que parte del problema es que si se siguieran las convenciones de nomenclatura, el problema no ocurriría; si prefijaras tus clases con c, por ejemplo, no tendrías una clase llamada Ambigüedad. Lo he ajustado un poco. – eAi