Widziałem inne pytania na temat SO dotyczące tego, ale żaden nie wyjaśnia tego w całości. Co to jest kompilator dla obsługi dwóch poniższych sytuacji? Próbowałem go z gcc 4.7.1 (z -std = C++ 0x), VS2010 i VS2012 uzyskać różne rezultaty na wszystkich:Operator konwersji niepotrzebny przeciążenie, kompilatory różnią się
Przykład 1:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = b;
}
wyjściowa:
- gcc 4.7.1: Ok
- VS2010: Ok
- VS2012: Fail: "nie można przekonwertować z BB do string"
Przykład 2:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = (string)b;
wyjściowa:
- GCC 4.7.1: ustała wywołanie przeciążony łańcucha (BB &) jest niejednoznaczną
- VS2010: OK
- VS2012: Błąd: "Nie można przekonwertować z BB na ciąg"
Używam ogólnej konwersji, ponieważ wdrażam coś podobnego doładowania :: dowolne, ale może jest lepszy sposób. Zaznacza to jako odpowiedź, że mksvetkov był dość podobny. – Rolle