c++无法将参数传递给std::priority_queue构造函数

c++ could not pass argument to std::priority_queue constructor

本文关键字:priority queue 构造函数 std 参数传递 c++      更新时间:2023-10-16

每个人。出于某种原因,我无法使用此语句初始化c++优先级队列。例如:

请将滚动条移到最右边,以便查看我的评论。

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

有人能告诉我这个例子是怎么回事吗?非常感谢。

顺便说一句,我知道std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1());这不是一个好的做法。因为一旦执行此语句,Compare1() object将被删除。CCD_ 4将指代被删除的对象。

然而,cplusplus.com中的例子表明,出于某些原因,这是有效的。

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

在这一点上我很困惑。

您一直是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));
   ^

错误消息显示您正在访问非类类型std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)()).push()方法。看看它的类型,特别是这个部分

(Compare1 (*)())

上面的类型是一个函数签名,正如错误消息所示,它是非类类型的。