2

我尝试了隐式转换,但这不起作用。

#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;
}
4

3 回答 3

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;
于 2012-12-05T06:53:20.967 回答
2

您是否尝试过重载 + 运算符?

std::string operator+(std::string& str, MyClass& x){
    return str + "bar"
} 

这将是一个免费功能,而不是 MyClass 的一部分。此外,可能还需要重载可交换情况。如果没有关系,你可以用上面的方式来表达。

于 2012-12-05T06:46:25.360 回答
1

对于 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;
}
于 2012-12-05T07:02:39.457 回答