使用decltype取函数类型遇到的“invalidly declared function type”问题

在C++ STL中,有一个优先队列的实现:std::priority_queue,定义于<queue>头文件,原型为:

template<
    typename _Tp, // 元素类型
    typename _Sequence = vector<_Tp>, // 容器类型
    typename _Compare  = less<typename _Sequence::value_type> // 比较器(Compare)类型
> class priority_queue

我定义了Node数据结构:

struct Node
{
    int value;
    int ext;
    static bool comp(Node &a, Node &b)
    {
        return a.value > a.value;
    }
};

为了得到一个存储Node的priority_queue,我这样定义:

priority_queue<Node, vector<Node>, decltype(Node::comp)> pq(Node::comp);

然后编译报错:

/usr/include/c++/5/bits/stl_queue.h:391:18: error: field ‘std::priority_queue<Node, std::vector<Node>, bool(Node&, Node&)>::comp’ invalidly declared function type
       _Compare   comp;
                  ^

为什么会这样呢?原因最终在《C++ Primer(第5版)》223页最下面几行找到了:

……唯一需要注意的地方是,牢记当我们将decltype作用于某个函数时,它返回函数类型而非指针类型。……

这意味着什么呢?这意味着decltype(Node::comp)得到的类型是一个函数类型,并非一个函数指针类型。而我在构造函数传入的Node::comp被转成了一个函数指针类型,因此类型是不匹配的,所以会报错。
pq正确的定义有下面两种,这两种方式都把_Compare类型设为了一个指针类型:

priority_queue<Node, vector<Node>, decltype(Node::comp) *> pq(Node::comp);
priority_queue<Node, vector<Node>, decltype(&(Node::comp))> pq(Node::comp);

你可能会奇怪,既然把_Compare类型设为指针类型可以解决问题,那把传入构造函数的参数从指针类型转为非指针类型是不是也能解决问题,就像这样:

priority_queue<Node, vector<Node>, decltype(Node::comp)> pq(*(Node::comp));

非常遗憾,这样做不可以。尽管对Node::comp这个函数指针进行了解引用(dereference),传入构造函数的仍然是函数指针,而且实际上不管对一个函数指针解引用多少次,你得到的还是一个函数指针。具体原因你可以查看StackOverflow上的这个问题How does dereferencing of a function pointer happen?

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值