2012-07-27 42 views
0

我一直在努力與C2440,當我使用std編譯錯誤:: min_element:性病編譯錯誤:: min_element

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:

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

的問題是,ptArrayconst。這意味着begin()end()返回const_iterator; min_element的專業化也將它們作爲參數。

A const_iterator不能被指定給iterator類型的變量,因此您需要將it_min的類型更改爲PointArray::const_iterator

+0

謝謝,最後問題解決了。 – feelfree 2012-07-27 15:18:37

0

你並不需要一個類,你需要綁定爲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>); 
+0

謝謝。但這也會導致我編譯問題。主要的問題是如果我給std :: min_element(ptArray.begin(),ptArray.end(),mycompare)賦一個變量,它總是失敗。 – feelfree 2012-07-27 14:53:43

+0

@feelfree:你忘了解碼迭代器嗎? – 2012-07-27 15:05:23

+0

不,我已經添加了代碼來重複錯誤。 – feelfree 2012-07-27 15:08:58