2013-07-29 2 views
1

모두. 어떤 이유로 나는이 문장을 초기화하지 않고 C++ priority_queue로 초기화했다. 예 :C++에서 std :: priority_queue 생성자에 인수를 전달할 수 없습니다.

내 의견을 보려면 스크롤 막대를 오른쪽으로 이동하십시오.

class Compare1 
{ 
    bool _is_reverse; 
public: 
    Compare1(bool is_reverse = true) 
    : _is_reverse(is_reverse) 
    {} 

bool operator() (const std::shared_ptr<int> &lhs, const std::shared_ptr<int> &rhs) const 
    { 
    return (*lhs > *rhs); 
    } 
}; 

void test3() 
{ 
    Compare1 tester; 
    std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1()); // THIS GIVES ME A ERROR  
    std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1(false)); // THIS GIVES ME A ERROR TOO 
    std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq1; // THIS IS FINE 

    std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq2(tester); // THIS IS FINE TOO 

    myq.push(std::make_shared<int>(200)); 
    myq.push(std::make_shared<int>(201)); 
    myq.push(std::make_shared<int>(202)); 
    myq.push(std::make_shared<int>(199)); 
    std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl; 

} 

나는 내 C++ 확인 - STL과 구현 :

#if __cplusplus < 201103L 
    template<typename _InputIterator> 
    priority_queue(_InputIterator __first, _InputIterator __last, 
      const _Compare& __x = _Compare(), 
      const _Sequence& __s = _Sequence()) 
: c(__s), comp(__x) 
    { 
    __glibcxx_requires_valid_range(__first, __last); 
    c.insert(c.end(), __first, __last); 
    std::make_heap(c.begin(), c.end(), comp); 
} 
#else 
    template<typename _InputIterator> 
    **priority_queue(_InputIterator __first, _InputIterator __last, 
      const _Compare& __x, 
      const _Sequence& __s)** 
: c(__s), comp(__x) 
    { 
    __glibcxx_requires_valid_range(__first, __last); 
    c.insert(c.end(), __first, __last); 
    std::make_heap(c.begin(), c.end(), comp); 
} 

    template<typename _InputIterator> 
    priority_queue(_InputIterator __first, _InputIterator __last, 
      const _Compare& __x = _Compare(), 
      _Sequence&& __s = _Sequence()) 
: c(std::move(__s)), comp(__x) 
    { 
    __glibcxx_requires_valid_range(__first, __last); 
    c.insert(c.end(), __first, __last); 
    std::make_heap(c.begin(), c.end(), comp); 
} 
#endif 

그리고, 내가이 줄 std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1());

prefectly 유효 생각을하지만 나는 그 컴파일 에러 메시지를 가지고 :

g++ -g -c -std=c++11 main.cc -o main.o 
main.cc: In function ‘void test3()’: 
main.cc:100:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    myq.push(std::make_shared<int>(200)); 
    ^
main.cc:101:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>,  std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    myq.push(std::make_shared<int>(201)); 
    ^
main.cc:102:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    myq.push(std::make_shared<int>(202)); 
    ^
main.cc:103:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    myq.push(std::make_shared<int>(199)); 
    ^
main.cc:104:34: error: request for member ‘top’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl; 
           ^
main.cc:104:56: error: request for member ‘size’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl; 
                ^
make: *** [main.o] Error 1 

누구든지이 예에서 어떤 일이 벌어지고 있는지 말해 줄 수 있습니까? 고마워.

나는 알고있다. std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1()); 이것은 좋은 습관이 아니다. 이 문이 실행되면 Compare1() object이 삭제되므로 Compare& _x은 삭제 된 개체를 나타냅니다.

그러나, cplusplus.com의 예는 몇 가지 이유로 유효합니다.

typedef priority_queue<int,vector<int>,mycomparison> mypq_type; 
mypq_type fifth (mycomparison()); 
mypq_type sixth (mycomparison(true)); 

나는이 시점에서 꽤 혼란 스럽다.

답변

6

당신은 C++의 희생자입니다. Most Vexing Parse. 대신에

std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1()); 
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1(false)); 

묶으 일을

생성자가 MVP 대해 확인 어떻게

std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq{Compare1()}; 
//                      ^  ^
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq{Compare1(false)}; 
//                      ^   ^

이제

std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq((Compare1())); 
//                      ^  ^
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq((Compare1(false))); 
//                      ^   ^

사용하거나 C++ (11)의 균일 한 초기화 구문을 매개 변수 괄호 오류? 오류 메시지 중 하나 볼 수 있습니다 :

main.cc:100:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’ 
    myq.push(std::make_shared<int>(200)); 
^

을 오류 메시지는 당신이 비 클래스 형std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)()).push() 방법에 액세스하는 것으로 나타났다. 특히이 부분

(Compare1 (*)()) 

상기 유형의 에러 메시지가 표시된 것을 같이 비 클래스 타입 인 함수 서명이며, 그 형태를 봐.

+4

"C++의 Vexing Parse의 희생자"- 우리는이 슬로건으로 티셔츠를 보내기 시작할 수 있도록 로비해야합니다. – Casey

관련 문제