25

私は自分で文字列クラスを書いています。そして、私はそのようなコードを持っています。オーバーロードしたいだけですoperator=。これは私の実際のコードであり、コードの最後の部分でエラーが発生します。

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class S {
    public:
        S();
        ~S() { delete []string;}
        S &operator =(const S &s);

    private:
        char *string;
        int l;
};

S::S()
{
    l = 0;
    string = new char[1];
    string[0]='\0';
}

S &operator=(const S &s)
{
    if (this != &s)
    {
        delete []string;
        string = new char[s.l+1];
        memcpy(string,s.string,s.l+1);
        return *this;
    }
    return *this;
}

しかし、残念ながら、エラー「S&operator =(const S&)」は非静的メンバー関数である必要があります。

4

2 に答える 2

42

クラス名がありません:

これはグローバル演算子であり、グローバルに=することはできません。

S &operator=(const S &s)

これをクラス関数として定義する必要があります。

S & S::operator=(const S &s)
//  ^^^
于 2012-10-11T21:00:55.900 に答える
6

PiotrNyczが合理的な答えを提供したと思います。ここでもう一言追加させていただきます。

C ++では、代入演算子のオーバーロード関数はできませんでしfriend functionた。operator =にfriend関数を使用すると、同じコンパイラエラー「overloading=operatorは非静的メンバー関数である必要があります」が発生します。

于 2014-01-07T23:14:39.367 に答える