![](/img/trans.png)
[英]Why is it necessary to explicitly call Myclass::operator string() with std::string::operator+()?
[英]How to get MyClass to work with std::string's operator+
我尝试了隐式转换,但这不起作用。
#include <string>
#include <iostream>
struct MyClass
{
operator std::string() { return "bar"; }
};
int
main( int argc, char* argv[] )
{
MyClass x;
std::cout << std::string( "foo" ) + x << std::endl;
return 0;
}
隐式转换将不起作用,因为已对字符串的operator+
进行了模板化,并且需要推导模板参数。 这看起来像是对正在发生的事情的更好的解释: https : //stackoverflow.com/a/8892794/964135
我只是进行强制转换或编写非模板operator+
。
一个愚蠢的解决方案是不推断类型,然后它将进行隐式转换:
std::cout << std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::string( "foo" ), x) << std::endl;
您是否尝试过重载+运算符?
std::string operator+(std::string& str, MyClass& x){
return str + "bar"
}
这将是一个免费功能,而不是MyClass的一部分。 此外,也可能需要使交换情况过载。 如果不重要,你可以用上面的表达来表达它。
对于Karthik T和Pubby给出的关于重载operator+()
的好答案,我想补充一点。
通常,您将需要在重载的operator+()
代码内访问MyClass
私有成员(与return "bar";
就像您大概剥离的示例一样)。 在这种情况下,您需要将其声明为friend
。 你不能将operator+()
作为MyClass
的成员,因为MyClass
位于operator +
的左侧。 请参阅下面的示例代码。
#include <string>
#include <iostream>
using namespace std;
struct MyClass {
public:
MyClass() : bar("bar") {}
friend string operator+(string& str, MyClass& x);
private:
string bar;
};
string operator+(string& str, MyClass& x) {
return str + x.bar;
}
int main( int argc, char* argv[] )
{
MyClass x;
string foo("foo");
std::cout << foo + x << std::endl;
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.