我正在尝试实现一个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 ++方面不是那么好。
答案 0 :(得分:2)
调用不明确,因为std::string::operator=
有超载std::string
和char
。可以使用tcn::proxy
来调用这两个:第一个使用std::string
转换运算符,第二个使用int
转换运算符,然后进行积分转换。
通常,重载分辨率更倾向于隐式转换序列,而不需要进行必要标准转换而不需要进行积分转换,但只有在两个转换序列通过相同函数时才考虑此选择。由于您有两条不同的路径通过两个不同的函数,因此调用是不明确的。
解决方案是不要对这类事情使用积分转换;它只会导致奇怪的边缘情况,令人惊讶的行为和隐藏的错误。