J'ai du code pour surcharger l'opérateur de conversion pour différents types :
#include <string>
#include <iostream>
class MyClass {
int m_int;
double m_double;
std::string m_string;
public:
MyClass() : m_int{1}, m_double(1.2), m_string{"Test"} {};
// overload the conversion operator for std::string
operator std::string() {
return m_string;
}
// overload the conversion operator for all other types
template <typename T>
operator T() {
if (std::is_same<T, int>::value)
return m_int;
else
return m_double;
}
};
int main() {
MyClass o;
int i = o;
double d = o;
std::string s = o;
std::cout << i << " " << " " << d << " " << s << std::endl;
}
Cela fonctionne correctement. Mais lorsque j'essaie de faire
std::string s;
s = o;
la compilation échoue avec
error: use of overloaded operator '=' is ambiguous (with operand types 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') and 'MyClass')
Apparemment, le compilateur instancie un opérateur de conversion différent de std::string(). Si je supprime la section template, le compilateur est forcé d'utiliser l'opérateur de conversion std::string() et cela fonctionne à nouveau. Qu'est-ce qui m'échappe ?