我尝试了隐式转换,但这不起作用。
#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;
}
答案 0 :(得分:4)
隐式转换无效,因为字符串的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;
答案 1 :(得分:2)
您是否尝试重载+运算符?
std::string operator+(std::string& str, MyClass& x){
return str + "bar"
}
这将是一个免费功能,不属于MyClass。此外,也可能需要使交换情况过载。如果不重要,你可以用上面的表达来表达它。
答案 2 :(得分:1)
对于Karthik T和Pubby给出的关于重载operator+()
的好答案,我想补充一点。
通常,您需要在重载的MyClass
代码中访问operator+()
的私有成员(与return "bar";
中的私有成员不同,就像您可能已删除的示例一样)。在这种情况下,您需要将其声明为friend
。您不能将operator+()
作为MyClass
的成员,因为MyClass
位于运营商+
的左侧。请参阅下面的示例代码。
#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;
}