C++ 模板化运算符字符串()赢得';当临时对象

C++ 模板化运算符字符串()赢得';当临时对象,c++,string,templates,operators,temporary-objects,C++,String,Templates,Operators,Temporary Objects,有人知道main中最后一行无法编译的原因吗(请注意,编译失败): 我不想使用这种变通方法,因为它的可维护性较差 有人知道另一种方法可以成功编译main()的最后一行吗?我认为公认的答案在这里并不适用,因为无论是否涉及模板,都可能存在多个转换(char*、alloc、string),而且对象是临时对象这一事实似乎很重要 编辑:这篇文章中的原始代码显示了一些类内模板专门化,这是从我的原始源代码中为SO创建一段独立代码的产物(我将一些命名空间级别的专门化移到了类中,VS2010没有抱怨)。问题不在于专

有人知道main中最后一行无法编译的原因吗(请注意,编译失败):

我不想使用这种变通方法,因为它的可维护性较差

有人知道另一种方法可以成功编译main()的最后一行吗?我认为公认的答案在这里并不适用,因为无论是否涉及模板,都可能存在多个转换(char*、alloc、string),而且对象是临时对象这一事实似乎很重要


编辑:这篇文章中的原始代码显示了一些类内模板专门化,这是从我的原始源代码中为SO创建一段独立代码的产物(我将一些命名空间级别的专门化移到了类中,VS2010没有抱怨)。问题不在于专业化。我修改了发布的代码,使之更接近原始代码(正如我刚才所做的),不用于类专门化(当然问题仍然存在)。德里克的答案表明它可能是特定于VS2010的。< /强>

< P>不知道VisualC++ 2010(9版本),但是不能在类本身中专门化模板化成员函数。根据我将此代码提供给的更现代的编译器发出的错误,它必须在名称空间范围内完成

所以

#包括
使用名称空间std;
福班
{
公众:
模板内联运算符TT()常量;
模板内联TT getAs()常量;
};
模板内联Foo::运算符字符串()常量{return“hi”;}
模板内联Foo::运算符int()常量{return 123;}
模板内联字符串Foo::getAs()常量{返回“bye”;}
Foo tempFoo(){return Foo();}
int main()
{
富富,;
string testStringLocal=foo;//确定
int testIntTemp=tempFoo();//确定
字符串testStringTemp=tempFoo().getAs();//确定
字符串testStringTemp2=tempFoo();//好的!
}

用Visual C++ 12和G+4.4.7.2编写./P>谢谢。但是这肯定不是专门化的:我的应用程序源代码不涉及类的专门化,我在创建独立的例子时把这些代码放进去(我不知道为什么VS 2010没有抱怨)。我做了相应的编辑。但您显示的代码表明这可能是2010年的一期,我将看看是否可以用我编辑的代码在VS2012 express中复制。在2012年也不起作用,所以不幸的是,这个答案也没有间接解决这个问题(根据编辑的帖子)。我提出了一个新问题。

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!
}
class Foo
{
public:
    operator string() const { return ::getAs<string>(); }
    operator int()    const { return ::getAs<int>(); }
    ...
};
#include <string>
using namespace std;

class Foo
{
public:
    template <typename TT> inline operator TT()     const;
    template <typename TT> inline TT       getAs()  const;
};

template <>  inline Foo::operator string() const { return "hi"; }
template <>  inline Foo::operator int()    const { return 123; }
template <>  inline string Foo::getAs()  const { return "bye"; }

Foo tempFoo() { return Foo(); }

int main()
{
    Foo foo;
    string testStringLocal = foo;       // OK
    int testIntTemp = tempFoo();        // OK
    string testStringTemp = tempFoo().getAs<string>();  // OK

    string testStringTemp2 = tempFoo();  // OK!
}