Неоднозначный вызов string::operator= для типа с неявным преобразованием в int и строку

Дана следующая программа:

#include <iostream>
#include <string>
using namespace std;
struct GenericType{
   operator string(){
      return "Hello World";
   }
   operator int(){
      return 111;
   }
   operator double(){
      return 123.4;
   }
};
int main(){
   int i = GenericType();
   string s = GenericType();
   double d = GenericType();
   cout << i << s << d << endl;
   i = GenericType();
   s = GenericType(); //This is the troublesome line
   d = GenericType();
   cout << i << s << d << endl;
}

Она компилируется в Visual Studio 11, но не в clang или gcc. У него проблемы, потому что он хочет неявно преобразовать из GenericTypeв intв char, но также может вернуть строку . поэтому возникает двусмысленность ( operator=(char)и operator=(string)оба соответствуют GenericType).

Однако с конструктором копирования все в порядке.

Мой вопрос: как разрешить эту двусмысленность без изменения содержимого main? Что мне нужно сделать, чтобы изменить GenericType, чтобы справиться с этой ситуацией?

9
задан curiousguy 22 July 2012 в 00:16
поделиться