c++无法将参数传递给std::priority_queue构造函数
c++ could not pass argument to std::priority_queue constructor
每个人。出于某种原因,我无法使用此语句初始化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 (*)())
上面的类型是一个函数签名,正如错误消息所示,它是非类类型的。
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- C++ queue.front();为什么不从第一个元素开始呢?
- 我可以擦除 std::queue 中间的节点吗?
- 获取大小时是否必须锁定 std::queue?
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- 销毁 std::queue 会导致内存错误
- 如何将一个 std::queue 的内容附加到另一个
- 使用元素加载 std::queue<uint8_t*> 的更有效方法?
- 为什么 std::queue 没有实现 insert() 而 std::d eque 实现了?
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- C++程序在 #include 时无法编译<stack>,#include<queue>
- 是boost :: lockfree :: Queue(在多线程程序中)可锁定
- std :: queue :: pop()在其std :: unique_ptr数据上操作
- 通过 std::queue 中的元素的值获取元素的索引
- 如何索引指向数组 [queue] 的指针数组
- 像std::queue这样的c++标准库容器是否保证是可重入的
- 如何使用"priority"进行多线程处理?
- 在 boost::lockfree:queue 默认构造函数的情况下断言失败
- C++ Floating-Point van Emde Boas (vEB) Priority Queue