1

STL priority_queue을 사용하고 생성자가 우선 순위를 저장하는 벡터에 대한 포인터를 가져 오는 사용자 지정 비교기 클래스를 제공합니다. 내가 잘못 가고오류 : '..'의 '..'멤버에 대한 요청입니다. 비 클래스 타입입니다

error: request for member 'empty' in 'seeds', which is of non-class type 'pq(CompareReachDist&) {aka std::priority_queue<unsigned int std::vector<unsigned int>, CompareReachDist>(CompareReachDist&)}' 

: - 따라서 그러나

#include <iostream> 
#include <queue>   // std::priority_queue 
#include <vector>   // std::vector 

using namespace std; 

class CompareReachDist 
{ 
    const vector<float> *reach_dists; 
public: 
    CompareReachDist(const vector<float> *input) 
    { 
     reach_dists = input; 
    } 

    bool operator() (const size_t &l, const size_t &r) const 
    { 
     return (reach_dists->at(l) > reach_dists->at(r)); 
    } 
}; 

typedef priority_queue<size_t, vector<size_t>, CompareReachDist> pq; 
vector<float> reach_dists; 

int main() 
{ 
    pq seeds(CompareReachDist(&reach_dists)); 
    bool isEmpty = seeds.empty(); 

    return 0; 
} 

, 컴파일에 나는 오류가

?

답변

3

이것은 구문 분석 문제입니다. 의 그것을 떨어져 휴식 보자

CompareReachDist(&reach_dists) 

당신이 정적 reach_dists의 주소와 임시 CompareReachDist를 생성 생각할 수 있습니다. 그러나 전반적인 선언의 문맥에서 그것은 CompareReachDist에 대한 참조로 해석됩니다. 이상하지만 C++의 문법이 대략 객체 선언에 대한 함수 선언을 선호하기 때문입니다. 다음은

pq seeds(CompareReachDist(&reach_dists)); 

입니다. 전체 기능 선언입니다. CompareReachDist&을 받고 pq을 반환합니다.

받은 오류는 분명히 기능에 전화 할 수있는 empty 회원이 없기 때문입니다.

C++ 11 이후의 해결책은 모호성과 그 해결 방법을 함수 선언으로 분리하는 목록 초기화를 선호하는 것입니다. 그러면 다음을 수행 할 수 있습니다.

pq seeds{CompareReachDist{&reach_dists}}; 

예상대로 개체를 가져옵니다.

+0

아, 네. 나는 그것을 지금 본다. 컴파일러가 더 이상 함수 선언을 위해 객체 선언을 재구성해야한다고 생각합니까? –

+0

@ ameya.dubey - C++ 11 초기화 구문을 선호합니다. 또는 CompareReachDist 매개 변수에 명명 된 변수를 도입하십시오. – StoryTeller

+0

@ ameya.dubey - 실제로 그렇게합니다. 도와 줘서 기뻐. – StoryTeller