C++ std::string的转换运算符无法处理赋值
我使用代理类型延迟工作,直到将结果分配给变量,它通过在代理类型上使用转换运算符来工作。为C++ std::string的转换运算符无法处理赋值,c++,conversion-operator,C++,Conversion Operator,我使用代理类型延迟工作,直到将结果分配给变量,它通过在代理类型上使用转换运算符来工作。为std::string添加转换运算符重载时,它可用于从代理构建字符串,但无法编译以进行赋值,并显示以下错误消息: 错误:“运算符”的重载不明确 虽然这个问题与上一个问题类似,但这里的解决方案不适用,因为我也使用模板转换运算符 以下是片段: #include <iostream> #include <string> struct Proxy { template < ty
std::string
添加转换运算符重载时,它可用于从代理构建字符串,但无法编译以进行赋值,并显示以下错误消息:
错误:“运算符”的重载不明确
虽然这个问题与上一个问题类似,但这里的解决方案不适用,因为我也使用模板转换运算符
以下是片段:
#include <iostream>
#include <string>
struct Proxy
{
template < typename T >
operator T ()
{
T res;
std::cerr << "Converting to T: " << typeid( T ).name() << "\n";
return res;
}
operator std::string ()
{
std::string res;
std::cerr << "Converting to string\n";
return res;
}
};
int main()
{
struct Foo {};
Proxy proxy;
bool b = proxy; // Construct, works
b = proxy; // Assignment, works
Foo f = proxy; // Construct, works
f = proxy; // Assignment, works
std::string s = proxy; // Construct, works
s = proxy; // Assignment, this line fails to compile <<<<<
return 0;
};
#包括
#包括
结构代理
{
模板
算子T()
{
T res;
标准:cerr
如何使此代理与字符串赋值一起工作
编译器无法告诉您需要什么转换。它可以是任何可用于构造std::string
-char
,char*
,std::string
因此,解决方案是告诉编译器您想要什么。进行显式运算符调用:
s = proxy.operator std::string();
你看到的确切错误是什么?很好的谜语。很有趣。@RetiredInja这是一个有错误的godbolt链接。当链接坏了或你的评论被删除时,你有没有理由不能将错误复制/粘贴到你的问题中?这似乎与std::string
对oper有几个重载有关ator=
由于即使从代理中删除运算符std::string()
,问题仍然存在,请参阅:调用特定转换运算符的首选解决方案是使用类型转换,不要直接调用运算符:s=(std::string)代理;
或更好:s=静态转换(代理);
使用代理的全部原因是推断结果类型,因此它不是由用户显式键入的。@RemyLebeau,你为什么不自己尝试一下呢?@MustafaSerdarŞanlı,在这种情况下,你应该放弃整个想法。编译器怎么可能知道要使用哪个重载?是的,当我尝试你的代码时,我还不确定要使用哪个重载wer,我自己,因为我不知道模板参数推断的所有规则(因为我是一个老Perl程序员,赋值的左边向右边传递上下文)但我确实发现了@SidS发现的相同问题。无论如何,我试图进行模板专门化,只是为了看看编译器会做什么,但没有成功。有人怀疑你能做你想做的事情。这不是Perl。编译器不知道类型。