成员函数的decltype
Decltype of member functions
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
可以消除两种情况下的错误。
你真正想要的是:
struct a {
int f(int x, int j) { return 2;}
decltype(&a::f) p;
};
因为您所指的 f
是一个成员函数。推导的类型是:
int(a::*)(int, int)
如果没有 &
,编译器会假设您正在尝试调用该函数而不向其提供参数。也许 Clang 的错误消息对此更清楚:
error: call to non-static member function without an object argument
decltype(a::f) p;
如果您真的不想要指针类型,您可以稍后从 <type_traits>
.
应用 std::remove_pointer_t
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
可以消除两种情况下的错误。
你真正想要的是:
struct a {
int f(int x, int j) { return 2;}
decltype(&a::f) p;
};
因为您所指的 f
是一个成员函数。推导的类型是:
int(a::*)(int, int)
如果没有 &
,编译器会假设您正在尝试调用该函数而不向其提供参数。也许 Clang 的错误消息对此更清楚:
error: call to non-static member function without an object argument decltype(a::f) p;
如果您真的不想要指针类型,您可以稍后从 <type_traits>
.
std::remove_pointer_t