gpt4 book ai didi

c++ - 模板化转换运算符 string() 无法编译

转载 作者:可可西里 更新时间:2023-11-01 18:39:37 24 4
gpt4 key购买 nike

以下在 VS 2005 中编译但在 2010 或 2012 中不编译:

#include <string>

template <typename TT> TT getAs();
template <> std::string getAs() { return "bye"; }
template <> int getAs() { return 123; }

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

template <typename TT>
operator TT() const { return ::getAs<TT>(); }
};

Foo tempFoo() { return Foo(); }

int main()
{
Foo foo;
std::string testStringLocal = foo; // OK in 2010, FAIL in 2012
int testIntTemp = tempFoo(); // OK
std::string testStringTemp = tempFoo().getAs<std::string>(); // OK
const std::string& testStringTemp2 = tempFoo(); // OK

std::string testStringTemp3 = tempFoo(); // FAIL!
}

编译器在 main() 的两行中提示说转换是不可能的。但是,如果我用一组等效的重载替换 operator TT() 的模板定义,

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

operator std::string() const { return ::getAs<std::string>(); }
operator int() const { return ::getAs<int>(); }
};

然后一切都很好。请注意,根据标记为 OK 的 main() 行,当字符串为模板参数 AND(在 2010 年,但在 2012 年不是)时,此问题特定于模板运算符 TT,涉及临时。

这不是有效代码吗?为什么它在某些情况下有效?

最佳答案

字符串的复制构造函数之间似乎存在歧义。

使用这一行解决了歧义:

std::string testStringLocal = (const std::string&)foo;

operator= 也是如此:

std::string testStringLocal;               // define empty string
testStringLocal = (const std::string&)foo; //OK
testStringLocal = foo; // Fail in all VS compilers (VS2010, 2012, 2013)

我不知道为什么 std::string 的行为与其他类不同,很可能是大量的构造函数和赋值运算符。

当为编译器提供多个选项来执行转换时,在本例中为双重转换 (Foo -> string -> const string&) 它会失败。它还可以选择 Foo -> int -> const string& 或类似的东西。

关于c++ - 模板化转换运算符 string() 无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com