Ho il seguente pezzo di codice:errore Clang: conversione ambiguo 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 segnala il seguente errore:
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.
non riesco a capire perché è il compilatore genera un errore anche se ho definito l'operatore di conversione e faccio esplicita la conversione in quel posto specifico usando static_cast <>. Il codice passa la compilazione con i compilatori GCC 4.5.2 e Visual Studio 2008. La versione Clang è 3.1, creata da me stesso dai repository git di Clang e LLVM un paio di giorni fa.
Quindi, Clang segnala un errore effettivo? E se sì, perché è un errore dato che è per nulla ovvio (non chiederò perché gli altri compilatori non ne parlano)?
UPDATE: il codice di esempio è ora un piccolo esempio compilabile (mi dispiace di non farlo dalla prima volta) e di replicare la situazione reale che ho. Sembra che l'operatore di conversione di AliasA sia il problema, perché se viene rimosso allora tutto si compila bene. La cosa sgradevole in questo momento è che per il codice di cui sopra ottengo errori anche da GCC.
UPDATE 2: ho aggiunto del codice al campione per riflettere meglio la mia situazione reale; l'unica differenza è che per il campione sopra ho anche un errore da GCC, mentre per il mio vero codice non lo faccio.
Puoi mostrare la dichiarazione di 'someFunc'? –
Probabilmente è necessario mostrare più codice per capire la risposta (un piccolo esempio compilabile sarebbe il migliore). –
Qual è la dichiarazione di AliasB? –