C++:错误 C2678:二进制"=":未找到采用类型为"const SPoint"的左侧操作数的运算符

C++: error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const SPoint'

本文关键字:SPoint const 类型 运算符 操作数 二进制 C2678 错误 C++      更新时间:2023-10-16

这是我的代码:

#include <StdAfx.h>;
#include <iostream>;
#include <vector>;
#include <algorithm>;
#include <iterator>;
using namespace std;
struct SPoint
{
    int id;
    int X;
    int Y;
};
bool operator<(const SPoint& p1, const SPoint&p2){
    return p1.id <p2.id;
}
vector<SPoint> points;
vector<SPoint> chosen;
vector<SPoint> cleared;
vector<SPoint>::iterator it;
void print_vect(const vector<SPoint> & vect)
{
    for (int i = 0; i < vect.size(); ++i)
    {
        cout << vect[i].id << " (" << vect[i].X << "," << vect[i].Y << ")"<<endl;               
    }           
    cout << endl;   
}
bool compare(double val1, double val2)
{
    return val1 > val2;
}
void sort_points(const vector<SPoint> & vect, char command)
{
    bool cmp_result;
    SPoint temp;
    bool sorted=true;
    for (int i = 0; i < vect.size()-1 ; i++)
    {
        sorted=true;
        for (int j = 1; j <= vect.size()-1; j++)
        {
            switch (command) 
            {
                case 'x': 
                    {
                        cmp_result = compare(vect[j-1].X, vect[j].X); 
                        break;
                    }
                case 'y': 
                    {
                        cmp_result = compare(vect[j-1].Y, vect[j].Y); 
                        break;              
                    }               
                case 'i': 
                    {
                        cmp_result = compare(vect[j-1].id, vect[j].id); 
                        break;              
                    }           
            }
            if (cmp_result)
            {
                sorted = false;
                temp = vect[j-1];
                vect[j-1] = vect[j];
                vect[j] = temp;
            }
        }
        if (sorted) 
        {
            cout << "Sorted:" << endl;
            print_vect(vect);           
            break;
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    SPoint temp;
    for (int i = 0; i < 10; i++)
    {
        temp.id = i;
        temp.X = i;
        temp.Y = i;
        points.push_back(temp);
    }
    for (int i = 5; i < 10; i++)
    {
        temp.id = i;
        temp.X = i;
        temp.Y = i;
        chosen.push_back(temp);
    }
    cout << "Points:" << endl;
    print_vect(points);
    cout << endl << endl;
    cout << "Chosen:" << endl;
    print_vect(chosen);
    system("pause");
    sort_points(points, 'i');
    sort_points(chosen, 'i');
    set_difference(points.begin(), points.end(), chosen.begin(), chosen.end(), back_inserter(cleared));
    print_vect(cleared);
    return 0;
}

谁能帮助我理解为什么我有这些错误:

1>c:usersгостьdocumentsvisual studio 2010projectsgrablevskij2grablevskij2grablevskij2.cpp(110): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const SPoint' (or there is no acceptable conversion)
1>          c:usersгостьdocumentsvisual studio 2010projectsgrablevskij2grablevskij2grablevskij2.cpp(18): could be 'SPoint &SPoint::operator =(const SPoint &)'
1>          while trying to match the argument list '(const SPoint, const SPoint)'
1>c:usersгостьdocumentsvisual studio 2010projectsgrablevskij2grablevskij2grablevskij2.cpp(111): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const SPoint' (or there is no acceptable conversion)
1>          c:usersгостьdocumentsvisual studio 2010projectsgrablevskij2grablevskij2grablevskij2.cpp(18): could be 'SPoint &SPoint::operator =(const SPoint &)'
1>          while trying to match the argument list '(const SPoint, SPoint)'

在您的sort_points函数中,您将vect声明为const。之后,你说:

vect[j-1] = vect[j];
vect[j] = temp;

由于vectconst,这导致operator[]const版本被调用,它返回一个const对对象的引用,这是不可赋值的。

考虑到它如何命名为sort_points并且不返回新向量,我希望它修改我传入的向量。