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+()に、1点付け加えたいと思います。

通常、オーバーロードされたコードMyClass内のプライベートメンバーにアクセスする必要があります(おそらく削除された例のように)。その場合は、として宣言する必要があります。は演算子の左側にあるため、のメンバーとして持つことはできません。以下のサンプルコードを参照してください。operator+()return "bar";friendoperator+()MyClassMyClass+

#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 に答える