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。编译器不知道类型。