C:错误 C2784:'bool std::运算符<

C: error C2784: 'bool std::operator <

本文关键字:std 运算符 lt bool 错误 C2784      更新时间:2023-10-16

我用的是Visual Studio 2010。

struct SPoint
{
    int id;
    int X;
    int Y;
};
////////////////
vector<SPoint> points;
vector<SPoint> chosen;
////////////////
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;   
}
////////////////
print_vect(points);

编译器显示:

1>c:program files (x86)microsoft visual studio 10.0vcincludealgorithm(4674): error C2784: 'bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::move_iterator<_RanIt> &' from 'SPoint'
1>          c:program files (x86)microsoft visual studio 10.0vcincludeiterator(371) : see declaration of 'std::operator <'

我在一个单独的项目中建模:

struct SPoint
{   
    int X;
    int Y;
};
vector<SPoint> points;
vector<SPoint> selected;
void print_vector(const vector<SPoint> & points) {    
    for (int i = 0; i < points.size(); i++)
    {
        cout << '('<<points[i].X <<',' <<points[i].Y <<')'<< endl;
    }
    cout << endl;
}
int main ()
{
    SPoint temp = {0, 0};
    for (int i = 0; i < 11;i++)
    {
        temp.X = i;
        temp.Y = i;
        points.push_back(temp);
    }
    for (int i = 5; i< 11;i++)
    {
        temp.X = i;
        temp.Y = i;
        selected.push_back(temp);
    }
    print_vector(points);       
    system ("pause" );
  return 0;
}

效果很好。我试图在这个问题上找到一些东西。他们说,编译器不能比较两个对象。将"<"方法添加到类中。但目前我学的是过程编程。那么,我的试验例子就成功了。为什么?该怎么做?

在您的代码中,set_difference调用operator<来比较points/chosen中的元素:

set_difference(points.begin(), points.end(),
    chosen.begin(), chosen.end(), back_inserter(cleared));

要使你的代码编译,你需要重载operator<点类型,例如:

bool operator<(const SPoint& lhs, const SPoint& rhs)
{
  return lhs.id < rhs.id;
}