我正在向std::priority_queue
声明一个自定义比较器,如下所示:
std::priority_queue<art_node *, std::vector<const art_node *>,
decltype(&compare_art_node_score_pq)> q(compare_art_node_score_pq);
if(metric == FREQUENCY) {
q = std::priority_queue<art_node *, std::vector<const art_node *>,
decltype(&compare_art_node_frequency_pq)>(compare_art_node_frequency_pq);
}
两个比较器函数的定义如下:
bool compare_art_node_frequency_pq(const art_node *a, const art_node *b) {
return !compare_art_node_frequency(a, b);
}
bool compare_art_node_score_pq(const art_node* a, const art_node* b) {
return !compare_art_node_score(a, b);
}
这在gcc
和Apple clang-800.0.42.1
上编译正常,但在Apple clang-902.0.39.1
上,我收到以下错误:
In file included from /Users/username/code/project/src/file.cpp:13:
/Library/Developer/CommandLineTools/usr/include/c++/v1/queue:401:5: error: static_assert failed ""
static_assert((is_same<_Tp, value_type>::value), "" );
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/username/code/project/src/file.cpp:909:51: note: in instantiation of template class 'std::__1::priority_queue<art_node *,
std::__1::vector<const art_node *, std::__1::allocator<const art_node *> >, bool (*)(const art_node *, const art_node *)>'
requested here
decltype(&compare_art_node_score_pq)> q(compare_art_node_score_pq);
^
/Users/username/code/project/src/file.cpp:912:13: error: no matching conversion for functional-style cast from 'bool
(const art_node *, const art_node *)' to 'std::priority_queue<art_node *, std::vector<const art_node *>,
decltype(&compare_art_node_frequency_pq)>' (aka 'priority_queue<art_node *, vector<const art_node *>, bool (*)(const
art_node *, const art_node *)>')
q = std::priority_queue<art_node *, std::vector<const art_node *>,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/usr/include/c++/v1/queue:392:28: note: candidate constructor (the implicit copy constructor)
not viable: no known conversion from 'bool (const art_node *, const art_node *)' to 'const std::__1::priority_queue<art_node
*, std::__1::vector<const art_node *, std::__1::allocator<const art_node *> >, bool (*)(const art_node *, const art_node
*)>' for 1st argument
class _LIBCPP_TEMPLATE_VIS priority_queue
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/queue:392:28: note: candidate constructor (the implicit move constructor)
not viable: no known conversion from 'bool (const art_node *, const art_node *)' to 'std::__1::priority_queue<art_node *,
std::__1::vector<const art_node *, std::__1::allocator<const art_node *> >, bool (*)(const art_node *, const art_node *)>'
for 1st argument
/Library/Developer/CommandLineTools/usr/include/c++/v1/queue:392:28: note: candidate constructor
(the implicit default constructor) not viable: requires 0 arguments, but 1 was provided
2 errors generated.