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
可以消除这两种情况下的错误。
你真正想要的是:
struct a {
int f(int x, int j) { return 2;}
decltype(&a::f) p;
};
由于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
指针类型。
“编译器假定您正在尝试调用该函数而不提供参数。”这很奇怪,因为它不会假设如果我传递decltype与普通函数的名称。此外,我不知道类成员的类型前面有一个范围操作符 - 我应该查看哪些内容才能更好地理解? – Silversonic
@Silversonic“成员函数指针”我猜。请记住,任何非静态成员函数都需要将'this'隐式地传递给它“,所以你可以看到'Return(Class :: *)(Arg1,Arg2,...)'为'Return(Class * const ,Arg1,Arg2,...)'这就是为什么'Return(Class :: *)(Arg1,Arg2,...)'和'Return(*)(Arg1,Arg2,...)'不可能是相同的类型。 – Shoe
你使用的是什么编译器和编译器版本? –
@RichardChambers g ++ 4.8.1 – Silversonic