C ++重载转换运算符hack

时间:2017-01-25 10:21:42

标签: c++

我正在尝试实现一个hack,我试图重载返回。我会让代码说话。

namespace tcn
{
    class foo
    {
        std::string blah;

    public:
        class proxy
        {
            int intval;
            std::string strval;
        public:
            proxy(int intv, std::string strv) : intval(intv), strval(strv) {};
            operator int() const { return intval; }
            operator std::string() const { return strval; }

        };

        foo();
        ~foo();

        proxy get();
    };

    foo::foo()
    {
        // Create stuff //
    }

    foo::~foo()
    {
        // Destroy stuff //
    }

    foo::proxy foo::get()
    {
        int intval = 911;
        std::string strval = "Hello!?";

        proxy temp(intval, strval);

        return temp;
    }
}



int main()
{
    tcn::foo bar;

    std::string ts = bar.get(); // OK
    int ti = bar.get(); // OK

    ti = bar.get(); // OK

    ts = bar.get(); // Compile error here

    return 0;
}

如果我尝试编译代码,则会出现如下错误

  

错误:' operator ='模糊过载(操作数类型是   ' std :: string {aka std :: basic_string}'和&#t; tcn :: foo :: proxy')
  ts = bar.get();

我想知道如何克服这个问题。我已经看到了其他方法来实现这一点,使用'提示' ,但我试图给用户一个简单的界面。所以我正在寻找用户方面的简单分配。怎么可以实现呢?

提前谢谢你,如果这看起来很蹩脚 - 我道歉。我在C ++方面不是那么好。

1 个答案:

答案 0 :(得分:2)

调用不明确,因为std::string::operator=有超载std::stringchar。可以使用tcn::proxy来调用这两个:第一个使用std::string转换运算符,第二个使用int转换运算符,然后进行积分转换。

通常,重载分辨率更倾向于隐式转换序列,而不需要进行必要标准转换而不需要进行积分转换,但只有在两个转换序列通过相同函数时才考虑此选择。由于您有两条不同的路径通过两个不同的函数,因此调用是不明确的。

解决方案是不要对这类事情使用积分转换;它只会导致奇怪的边缘情况,令人惊讶的行为和隐藏的错误。