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());

, но я получил эти сообщения об ошибках компиляции:

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 

может ли кто-нибудь сказать мне, что происходит в этом примере? большое спасибо.

BTW, я знаю std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1()); Это не хорошая оценка. Потому что Compare1() object будет удален после выполнения этого оператора. a 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)); 

заключите в скобки параметры конструктора

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 в

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 ошибки? Давайте посмотрим, один из сообщения об ошибке:

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)); 
^

Сообщение об ошибке показали, что вы обращаетесь к .push() метод типа неклассовуюstd::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)()). Посмотрите на его тип, а именно эта часть

(Compare1 (*)()) 

выше типа является функцией подписи, которая, как то, что показано сообщение об ошибке, имеет тип неклассовую.

+4

«Вы стали жертвой самого сильного анализа Си ++» - Мы должны лоббировать SO, чтобы начать рассылку футболок с этим лозунгом. – Casey