为std :: priority_queue声明自定义比较器时发生静态断言错误

时间:2018-04-13 10:23:01

标签: c++ xcode

我正在向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);
}

这在gccApple 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.

0 个答案:

没有答案