Кто-нибудь знает, почему последняя строка в main не компилируется (обратите внимание, что компиляция не выполняется):
template <typename TT> inline TT getAs();
template <> string getAs() { return "bye"; }
template <> int getAs() { return 123; }
class Foo
{
public:
template <typename TT>
inline operator TT() const { return ::getAs<TT>(); }
template <typename TT>
inline string getAs() const { return ::getAs<TT>(); }
};
Foo tempFoo() { return Foo(); }
int main()
{
Foo foo;
string testStringLocal = foo; // OK
int testIntTemp = tempFoo(); // OK
string testStringTemp = tempFoo().getAs<string>(); // OK
const string& testStringTemp2 = tempFoo(); // OK
string testStringTemp3 = tempFoo(); //.getAs<string>(); // FAIL!
}
Как я указал в комментариях к основным строкам,
- неявное преобразование из Foo в строку отлично компилируется для невременного объекта (например, foo),
- а также на временном объекте при преобразовании в int (или long и т. д.)
- он отлично работает при преобразовании в строку с помощью метода
- а также если тип
const string&
вместо строки
Пробовал это на VS2010. Обратите внимание, что приведенный выше код отлично компилируется в 2005 году, но я считаю, что 2010 год подходит.
Неявное преобразование в строку с помощью оператора работает нормально, если я удаляю определение и специализации шаблона и просто явно определяю каждую перегрузку:
class Foo
{
public:
operator string() const { return ::getAs<string>(); }
operator int() const { return ::getAs<int>(); }
...
};
Я бы предпочел не использовать этот обходной путь, поскольку он менее ремонтопригоден.
Кто-нибудь знает другой способ успешной компиляции последней строки main()? Я не думаю, что принятый ответ на оператор явного преобразования и шаблонного преобразования применим здесь, потому что возможны множественные преобразования (char *, alloc, string) независимо от того, задействованы ли шаблоны, и тот факт, что объект является временным, кажется, имеет значение.
РЕДАКТИРОВАТЬ: Исходный код в этом посте показал некоторую специализацию шаблонов в классе, это был артефакт создания автономного фрагмента кода для SO из моего исходного источника (я переместил некоторые специализации на уровне пространства имен в класс, и VS2010 не жаловался ). Проблема не в специализации. Я изменил размещенный код, чтобы он был ближе к оригиналу (как я только что сделал), не использует специализацию в классе (конечно, проблема все еще существует). Ответ Дерека указывает, что это может быть связано с VS2010.