成员函数的去除类型

时间:2015-10-13 22:33:22

标签: c++ function member decltype

class A {
    int f(int x, int j) { return 2;}
    decltype(f)* p;
};

给我错误:

error: decltype cannot resolve address of overloaded function

我无法理解为什么这个错误甚至会说到重载函数。同样,我认为可能需要使用范围运算符来访问该函数:

class A {
    int f(int x, int j) { return 2;}
    decltype(A::f)* p;
};

这仍然给我一个错误但更清晰的描述:

error: invalid use of non-static member function 'int A::f(int, int)'

为什么我不允许使用decltype来查找成员函数的类型?或者,将成员函数设置为static可以在任何一种情况下删除错误。

1 个答案:

答案 0 :(得分:9)

你真正想要的是:

struct a {
    int f(int x, int j) { return 2;}
    decltype(&a::f) p;
};

Live demo

由于您所指的f是成员函数。推导出的类型是:

int(a::*)(int, int)

如果没有&,编译器会假设您正在尝试调用该函数而不向其提供参数。也许Clang的错误信息更清楚:

error: call to non-static member function without an object argument
    decltype(a::f) p;

如果您真的不想要指针类型,可以稍后从std::remove_pointer_t应用<type_traits>