Ни один оператор «+ =» не соответствует этим операндам - PullRequest
0 голосов
/ 16 июня 2019

У меня есть h-файл, в котором есть класс с именем MainControl и структура с именем Vote.

Внутри MainControl Я определяю публичный оператор следующим образом (это функция-член):

MainControl& operator+=(Vote& v);

В соответствующем файле .cpp у меня есть эта функция:

MainControl& MainControl::operator+=(Vote& v){
...
}

Когда я пытаюсь в другом файле написать что-то вроде этого:

mc+=v

Где mc это объект из класса MainControl, а v объект из структуры Vote.

Я получаю эту ошибку:

 error C2679: binary '+=': no operator found which takes a right-hand operand of type 'Vote' (or there is no acceptable conversion)

Я включил правильные файлы, которые, как мне кажется, у меня работает очень похожий оператор (вместо struct Vote он включает другой класс).

Понятия не имею, чем это вызвано, кто-нибудь может помочь?

EDIT:

Оператор используется следующим образом:

mc += Vote(vr1, "Cyprus");

Где mc из класса MainControl.

Структура голосования выглядит так:

struct Vote
{
    Voter voter;
    string* voted_state;
    // ALL is public here.

    Vote(Voter current_voter, string state1, string state2 = "", string state3 = "", string state4 = "", string state5 = "", string state6 = "", string state7 = "", string state8 = "", string state9 = "", string state10 = "") :
        voter(current_voter), voted_state(new string[VOTE_ARRAY_SIZE]){
        voted_state[0] = state1;
        voted_state[1] = state2;
        voted_state[2] = state3;
        voted_state[3] = state4;
        voted_state[4] = state5;
        voted_state[5] = state6;
        voted_state[6] = state7;
        voted_state[7] = state8;
        voted_state[8] = state9;
        voted_state[9] = state10;
    }
    ~Vote() {
        delete[] voted_state;
    }
};

В аналогичной операции, которая не дает мне ошибок компиляции, оператор используется следующим образом:

mc += p1

Где p1 - это объект от имени участника класса, а mc - объект от класса MainControl.

В файле .h, где я определяю класс MainControl, у меня есть это объявление:

MainControl& operator+=(Participant& p);

Участник класса выглядит так:

class Participant
{
    string state_name;
    string song_name;
    int time_length;
    string singer_name;
    bool is_registered;
public:
    Participant(string state, string song, int time, string singer):
    state_name(state),song_name(song),singer_name(singer),time_length(time),is_registered(false){
    }
    ~Participant() = default;
    string state() const;
    string song() const;
    int timeLength() const;
    string singer() const;
    int isRegistered() const; 
    void update(const string song, const int time, const string singer);
    void updateRegistered(const bool status);
};

p1 было определено так:

Participant p1("USA", "Song_USA", 175, "Singer_USA");

1 Ответ

0 голосов
/ 16 июня 2019

ваш оператор + = принимает (неконстантную) ссылку на l-значение

MainControl& operator+=(Vote& v);

, тогда вы передаете ему значение r:

mc += Vote(vr1, "Cyprus");

это непреобразуется в (неконстантную) ссылку на l-значение

, если вам (как указано) нужно изменить «Голосование» во время этой операции, вы можете сделать следующее:

auto v1 = Vote(vr1, "Cyprus");
mc += v1;

таким образомВы можете передать Голосование оператору, как и намереваетесь.

Но: это не очень хороший дизайн, и он укусит вас позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...