没有运算符“ + =”与这些操作数匹配

时间:2019-06-15 21:11:10

标签: c++ operator-overloading

我有一个h文件,其中有一个名为-framework AudioToolbox的类和一个名为MainControl的结构。

在MainControl内部,我以这种方式定义了一个公共运算符(这是一个成员函数):

Vote

在匹配的.cpp文件中,我具有以下功能:

MainControl& operator+=(Vote& v);

当我尝试在另一个文件中编写这样的内容时:

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

其中mc+=v 是MainControl类的对象,而v是结构mc的对象。

我收到此错误:

Vote

我确实包含了我相信的正确文件,因为我有一个非常相似的运算符为我工作(而不是结构 error C2679: binary '+=': no operator found which takes a right-hand operand of type 'Vote' (or there is no acceptable conversion) ,它涉及另一个类)。

我不知道是什么原因造成的,有人可以帮忙吗?

编辑:

这种方式使用运算符:

Vote

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 是类名参与者的对象,而mc是类p1的对象。

在我定义类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

1 个答案:

答案 0 :(得分:0)

您的+ =运算符采用(非常量)左值引用

MainControl& operator+=(Vote& v);

然后您将一个r值传递给它:

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

这不能转换为(非常量)左值引用

如果(如上所述)您需要在此操作中修改“投票”,则可以执行以下操作:

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

通过这种方式,您可以按预期将投票传递给运营商。

但是: 这不是一个好的设计,以后会咬你的。