Decltype的成员函数

问题描述:

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

给我的错误:Decltype的成员函数

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可以消除这两种情况下的错误。

+0

你使用的是什么编译器和编译器版本? –

+0

@RichardChambers g ++ 4.8.1 – Silversonic

你真正想要的是:

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

Live demo

由于f你指的是一个成员函数。推导的类型是:

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

没有&编译器假设你正试图调用的函数,而不提供参数给它。也许锵的错误消息为更清楚:

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

如果你真的不希望你以后可以从<type_traits>申请std::remove_pointer_t指针类型。

+0

“编译器假定您正在尝试调用该函数而不提供参数。”这很奇怪,因为它不会假设如果我传递decltype与普通函数的名称。此外,我不知道类成员的类型前面有一个范围操作符 - 我应该查看哪些内容才能更好地理解? – Silversonic

+0

@Silversonic“成员函数指针”我猜。请记住,任何非静态成员函数都需要将'this'隐式地传递给它“,所以你可以看到'Return(Class :: *)(Arg1,Arg2,...)'为'Return(Class * const ,Arg1,Arg2,...)'这就是为什么'Return(Class :: *)(Arg1,Arg2,...)'和'Return(*)(Arg1,Arg2,...)'不可能是相同的类型。 – Shoe