我尝试了隐式转换,但这不起作用。
#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;
}
我尝试了隐式转换,但这不起作用。
#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+()
,我想补充一点。
通常,您需要访问MyClass
重载operator+()
代码内部的私有成员(与return "bar";
您可能剥离的示例中的 as 不同)。在这种情况下,您需要将其声明为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;
}