Ошибка при перегрузке оператора (должна быть нестатической функцией-членом)

Я пишу строковый класс самостоятельно. И у меня есть такой код. Я просто хочу перегрузить 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&)" должна быть нестатической функцией-членом.


person Rocketq    schedule 11.10.2012    source источник
comment
Этот фрагмент кода компилируется для меня с помощью g++.   -  person Neil    schedule 12.10.2012
comment
Не уверен, что вы делаете, но функция отлично компилируется с объявленным memcpy: а>   -  person chris    schedule 12.10.2012
comment
Вы не пропустили точку с запятой после определения класса, не так ли?   -  person Sergey Kalinichenko    schedule 12.10.2012
comment
@dasblinkenlight, это то, о чем я догадался, но я никогда не сталкивался с этой ошибкой при этом. Есть ли специальный компилятор, который делает?   -  person chris    schedule 12.10.2012
comment
@chris А, пропущенная точка с запятой после объявления ... Это может привести к таким забавным ошибкам :)   -  person Sergey Kalinichenko    schedule 12.10.2012
comment
Ваш оператор присваивания является закрытым, и вам не хватает ; в конце объявления класса. Опубликуйте минимальный код, который воспроизводит проблему.   -  person juanchopanza    schedule 12.10.2012
comment
Поскольку никто не упомянул об этом, используется термин перегрузка, а не перезагрузка. @dasblinkenlight, Да, весело... Может быть, после того, как вы будете получать их достаточно часто, вы сразу поймете, в чем причина.   -  person chris    schedule 12.10.2012
comment
Я использую компилятор G++ и обязательно добавил необходимые библиотеки.   -  person Rocketq    schedule 12.10.2012
comment
Скопируйте и вставьте свой актуальный код. Все это. Достаточно воспроизвести проблему.   -  person Benjamin Lindley    schedule 12.10.2012


Ответы (2)


Вам не хватает имени класса:

Это глобальный оператор, = не может быть глобальным:

S &operator=(const S &s)

Вы должны определить это как функцию класса:

S & S::operator=(const S &s)
//  ^^^
person PiotrNycz    schedule 11.10.2012

Я считаю, что PiotrNycz дал разумный ответ. Здесь, пожалуйста, извините меня, чтобы добавить еще одно слово.

В С++ функция перегрузки оператора присваивания не может быть friend function. Использование дружественной функции для оператора = вызовет ту же ошибку компилятора «перегрузка = оператор должен быть нестатической функцией-членом».

person Spectral    schedule 07.01.2014
comment
Это действительно должен быть комментарий к другому ответу, если это просто уточнение. В качестве альтернативы удалите примечание о том, что это еще одно слово, и сделайте его правильным ответом. - person Fund Monica's Lawsuit; 09.05.2016