const函数指针类型的“无效使用不完整类型”作为模板参数

时间:2015-07-17 19:44:13

标签: c++ c++11

考虑以下用于函子包装器的简化代码:

#include <iostream>
#include <utility> // std::forward

template <class F>
struct return_type;

template <class R, class C, class... A>
struct return_type <R (C::*)(A...)> {
  typedef R type;
};

// ----------------------

template <class FunctorType, typename FunctionPointerType>
class functor_wrapper {
public:
    FunctorType* f;
    FunctionPointerType p;
    functor_wrapper (FunctionPointerType pp) : p(pp) { f = new FunctorType; }

    template <class... A>
    typename return_type<FunctionPointerType>::type  operator() (A && ... args) {
        return ( (f->*p) (std::forward<A>(args)...) );
    }
};

// ----------------------

class my_less {
public:
    bool non_const_mem (const int& x, const int& y) {return x<y;}
    bool const_mem (const int& x, const int& y) const {return x<y;}
};

// ----------------------

int main(int argc, char *argv[])
{
    // functor_wrapper <my_less, bool (my_less::*)(const int&, const int&)>  foo(&my_less::non_const_mem); // OK!!
    functor_wrapper <my_less, bool (my_less::*)(const int&, const int&) const>  foo(&my_less::const_mem); // ERROR!!
                                                                    //  ^^^^
    std::cout << "is 2<5? " << (foo(2,5)?"yes":"no") << std::endl;
}

在'foo'的声明中,如果我使用常量成员函数,我得到编译错误“invalid use of incomplete type ‘struct return_type<bool (my_less::*)(const int&, const int&)const>’”。但是,如果它是非常量成员函数,它编译并运行就好了。当成员函数是常量类型时,我不明白这段代码中“不完整类型”的位置,以及我可以做些什么使它适用于常量成员函数?

我正在使用gcc版本4.8.4。

1 个答案:

答案 0 :(得分:2)

您缺少合适的合格模板专业化,如下所示:

template <class R, class C, class... A>
struct return_type <R (C::*)(A...) const> {
    typedef R type;             // ^^^^^
};