web-dev-qa-db-ja.com

演算子のオーバーロード中のエラー(非静的メンバー関数である必要があります)

自分で文字列クラスを書いています。そして、私はそのようなコードを持っています。オーバーロードしたい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&)'は非静的メンバー関数でなければなりません。

17
Rocketq

クラス名がありません:

これはグローバル演算子=をグローバルにすることはできません:

S &operator=(const S &s)

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

S & S::operator=(const S &s)
//  ^^^
20
PiotrNycz

PiotrNyczが合理的な答えを提供してくれたと思います。ここでもう1つWordを追加してください。

C++では、代入演算子のオーバーロード関数をfriend functionにすることはできませんでした。 operator =にフレンド関数を使用すると、同じコンパイラエラー「オーバーロード=演算子は非静的メンバー関数でなければならない」が発生します。

3
Mr. Pei