1

基本的な文字列の使用をシミュレートする小さなプログラムを実行しています。現在、一貫して機能していません。

この場合、プログラムは正常に動作します:

a = a+ w + 10 + " " + L"x" + 65.5 ; 

しかし、この方法で同じ文を書くと、すべてうまくいきません:

a = + w + 10 + " " + L"x" + 65.5 ; 

私のプログラムの何が問題なのか、誰か説明してもらえますか?

class sstring {
public:
    string s;

    sstring() {s.assign("");}

    template <class T>
    sstring& operator=(T i) {
        s = to_string( i );
        return *this;
    }

    sstring& operator=(const char *i) {
        s = i;
        return *this;
    }

    sstring& operator=(const wchar_t *w) {
        wstring ws = w;
        s.assign ( ws.begin(),ws.end() );
        return *this;
    }

    sstring& operator=(wstring w) {
        s.assign ( w.begin(),w.end() );
        return *this;
    }
    // *********************************************** +
    template <class T>
    sstring& operator+(T i) {
        s.append( to_string( i ));
        return *this;
    }

    sstring& operator+(const char *i) {
        s.append(i);
        return *this;
    }

    sstring& operator+(const wchar_t *i) {
        wstring ws = i;
        ws.assign(i);
        string cs;
        cs.assign ( ws.begin(),ws.end() );
        s.append( cs );
        return *this;
    }

    sstring& operator+(wstring w) {
        string temp;

        temp.assign( w.begin(),w.end() );
        s.append ( temp );
        return *this;
    }
    //*************************************************** <<
    friend ostream& operator<<( ostream &out,sstring obj);

};

ostream& operator<<( ostream &out,sstring obj) {
    out << obj.s;
    return out;
}

int main(void) {
    sstring a;
    wstring w;

    w = L"claudio";
    a = "daffra";
    a = a + w + 10 + " " + L"x" + 65.5;

    cout << "\ns :" << a;

    return 1;
}
4

2 に答える 2

1

タイプではないため、オーバーロードが使用されないため、これa = w + 10 + " " + L"x" + 65.5は機能しません。たとえば、空の:を先頭に追加してみてください。wsstringoperator+sstringa = sstring() + w + 10 + " " + L"x" + 65.5;

于 2013-02-25T14:39:30.317 に答える
0

次の 2 行は同じ結果になります。

int x;

x = x + 4;
x += 4;

あなたが提案した代替行は、次の形式です。

x =+ 4;

以下と同じように解析されます

x = +4;

これは次のように表示されます(ただし、これはクラスに対してオーバーロードできます):

x = 4;

ほとんどの人が通常の動作であると期待するものを実装している場合、これは wstring および sstring クラスにも適用されます。大まかなスキャンから、あなたはその行動を維持しようとしているように見えます.

追加コメント: 2 つの解析ツリーを見てみましょう。

a = a + 9 + " ";

これは次のようになります。

operator+(typeof(a), int);
operator+(typeof_previous_line, const char *);

タイプ + int と + const char* をオーバーロードして動作させた可能性があります。

一方で:

a += 9 + " ";

それはするでしょう:

operator+(int, const char *);
operator+=(typeof_previous_line);

これら 2 つの操作のうち最初の操作が定義されていない可能性があります。これに対する一般的な修正は、最初の項目を結果の型にキャストすることです。次のようなものです:

a += sstring(9) + " ";    // or
a += sstring() + 9 + " ";
于 2013-02-25T14:33:58.053 に答える