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