0

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:\research\projectivecorrection\code\iris\geometriccorrection\src\correspondingpoints\cp_hybrid.cpp    475

確かにGeocoordinatefloatは複雑なクラスであり、クラスGeocoordinatefloatを非常に簡単な方法で再定義すると:</ p>

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

};

それが動作します。しかし、私のプログラムでは、Geocoordinatefloatクラスの定義を変更することはできません。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;

}
4

2 に答える 2

4

問題はそれptArrayですconst。これは、それを意味しbegin()end()戻りconst_iteratorます; そして、その専門化min_elementはそれらを引数として取ります。

タイプの変数にAconst_iteratorを割り当てることはできないため、タイプをにiterator変更する必要があります。it_minPointArray::const_iterator

于 2012-07-27T15:12:11.850 に答える
0

クラスは必要ありません。引数をconst-referencesにバインド可能にする必要があります。このようなもの:

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>);
于 2012-07-27T14:41:35.300 に答える