std::min_element编译错误

Compiling error with std::min_element

本文关键字:编译 错误 element min std      更新时间:2023-10-16

当我使用std::min_element:时,我一直在努力解决C2440编译错误

struct compare_x_coordinate 
{
  bool operator() (Geocoordinatefloat i,Geocoordinatefloat j) { return i.x_<j.x_; }
} mycompare;
vector<Geocoordinatefloat>::iterator it_min;
vector<Geocoordinatefloat> ptArray;
ptArray.push_back(...)
ptArray.push_back(...)
...
it_min = std::min_element(ptArray.begin(),ptArray.end(),mycompare); // Line 475 Compiling error C2440
std::min_element(ptArray.begin(),ptArray.end(),mycompare);           // Right

VC2010的编译错误为:

Error   19  error C2440: '=' : cannot convert from 'const geometric::Geocoordinate<T> ' to 'geometric::Geocoordinate<T> *'  c:researchprojectivecorrectioncodeirisgeometriccorrectionsrccorrespondingpointscp_hybrid.cpp    475

的确,Geocoordinatefloat是一个复杂的类,如果我用一种非常简单的方式重新定义Geocoordiinatefloat类:

class Geocoordinatefloat
{
public:
  int x;
  int y;
  float Func()
  {
      return 1;
  };
  virtual void Fun2()
  {
      cout<<"hello"<<endl;
  };
};

它会起作用的。但对于我的程序来说,不可能更改Geocoordinatefloat类的定义。我想知道Geocoordinatefloat中的哪个元素会导致编译错误。对不起,我不能给出地理坐标浮动的定义,因为它是一个很大的类。谢谢你的建议。

编辑:根据请求,我制作了一个简单的程序来重复错误:

#include <iostream>
#include <vld.h> 
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename T>
class  Geocoordinate 
{
public:
    Geocoordinate() {};
    ~Geocoordinate() {};
     T x_;
     T y_;
 };
typedef Geocoordinate<float> Geocoordinatefloat;
typedef vector<Geocoordinatefloat> PointArray;

struct compare_x_coordinate 
{
    bool operator() (const Geocoordinatefloat &i,const Geocoordinatefloat &j) { return i.x_<j.x_; }
} mycompare;
void find_left_right_eignpoints(const PointArray &ptArray, 
        Geocoordinatefloat &left)
{
        vector<float> x_cord;
        PointArray::iterator it_min;
        std::min_element(ptArray.begin(),ptArray.end(),mycompare); 
        /******************************************************************************************
        // Error    1   error C2440: '=' : cannot convert from 'const Geocoordinate<T> 
        // ' to 'Geocoordinate<T> *'    c:main.cpp 41
        */
        it_min = std::min_element(ptArray.begin(),ptArray.end(),mycompare);  // error code is here
        int index_min = it_min-ptArray.begin();
        left    = ptArray[index_min];
}

int  main(int argc, char* argv[])
{

    return 0;
}

问题是ptArray就是const。这意味着begin()end()返回const_iterator;以它们为论据的CCD_ 6的专业化也是如此。

const_iterator不能分配给iterator类型的变量,因此需要将it_min的类型更改为PointArray::const_iterator

您不需要类,您需要使参数可绑定到const引用。类似这样的东西:

template <typename T>
bool compare_x(Geocoordinate<T> const & a, Geocoordinate<T> const & b)
{
    return a.x_ < b.x_;
}

用法:

std::vector<Geocoordinatefloat>::iterator it_min =
    std::min_element(ptArray.begin(), ptArray.end(), compare_x<float>);