tengo el siguiente fragmento de código:error Clang: conversión ambigua para static_cast
typedef int AliasB;
typedef unsigned short AliasA;
class Alias
{
public:
explicit Alias(int someInt) { }
};
// (*) !! below breaks the conversion path via AliasA !!
//typedef Alias AliasA;
class C
{
public:
C() { }
};
class B
{
public:
B() { }
B(const AliasB& value) { }
operator AliasB() const
{
return -1000;
}
C combine(const B& someB)
{
return C();
}
};
class A
{
public:
A() { }
operator B() const
{
return B();
}
operator AliasA() const
{
return 1001;
// (*) !! below breaks the conversion path via AliasA !!
//return AliasA(1000);
}
A high()
{
return A();
}
A low()
{
return A();
}
C process()
{
return (static_cast<B>(low())).combine(static_cast<B>(high()));
// (**) !! the below compiles fine !!
//B theB = low();
//return theB.combine(high());
}
};
inline int someFunc(unsigned int someParam, const B& bParam)
{
return 1;
}
inline A createSomeA()
{
return A();
}
int main()
{
A someA;
unsigned int counter = 200;
someFunc(counter, someA);
//someFunc(counter, static_cast<B>(createSomeA()));
someA.process();
return 0;
}
Clang informa del error siguiente:
clang_static_test.cpp:66:17: error: ambiguous conversion for static_cast from 'A' to 'B'
return (static_cast<B>(low())).combine(static_cast<B>(high()));
^~~~~~~~~~~~~~~~~~~~~
clang_static_test.cpp:21:7: note: candidate is the implicit copy constructor
class B
^
clang_static_test.cpp:25:5: note: candidate constructor
B(const AliasB& value) { }
^
clang_static_test.cpp:66:48: error: ambiguous conversion for static_cast from 'A' to 'B'
return (static_cast<B>(low())).combine(static_cast<B>(high()));
^~~~~~~~~~~~~~~~~~~~~~
clang_static_test.cpp:21:7: note: candidate is the implicit copy constructor
class B
^
clang_static_test.cpp:25:5: note: candidate constructor
B(const AliasB& value) { }
^
2 errors generated.
No puedo entender por qué es el compilador genera una error aunque tengo el operador de conversión definido y hago explícita la conversión en ese lugar específico utilizando static_cast <>. El código pasa la compilación con los compiladores GCC 4.5.2 y Visual Studio 2008. La versión Clang es 3.1, construida por mí mismo desde los repositorios git de Clang y LLVM hace un par de días.
Entonces, ¿Clang informa un error real? Y en caso afirmativo, ¿por qué es un error, ya que es que no me resulta nada obvio (no preguntaré por qué los otros compiladores guardan silencio al respecto)?
ACTUALIZACIÓN: el código de muestra ahora es un pequeño ejemplo compilable (lo siento por no hacer esto desde la primera vez) y la réplica de la situación real que tengo. Parece que el operador de conversión a AliasA es el problema, porque si se elimina, todo se compila correctamente. Lo desagradable en este momento es que para la pieza de código anterior también recibo errores de GCC.
ACTUALIZACIÓN 2: He añadido un código a la muestra para reflejar mejor mi situación real; la única diferencia es que para la muestra anterior también recibo un error de GCC, mientras que para mi código real no.
¿Puedes mostrar la declaración de 'someFunc'? –
Probablemente necesite mostrar más código para descubrir la respuesta (un pequeño ejemplo compilable sería lo mejor). –
¿Cuál es la declaración de AliasB? –