我有这个问题:
template <void (*F)(int)> struct FunctionWrapper // This compiles and works
{
static void call_it()
{
F(0);
}
};
class MyClass
{
public:
static void callMe(int k)
{
}
};
template <void (MyClass::*F)(int)> struct FunctionWrapper // Error - F incompatible with declaration
{
static void call_it()
{
MyClass::F(0);
}
};
为什么我可以使用函数指针(编译时常量)但不能使用类成员(甚至是静态)?
答案 0 :(得分:2)
静态函数与普通函数具有相同的类型签名;它不是真正的会员功能。
答案 1 :(得分:0)
为什么我可以使用函数指针(编译时常量)但不能使用类成员(甚至是静态)?
您可以使用指向静态函数的指针作为常规函数指针。例如,以下工作:
template <void (*F)(int)> struct FunctionWrapper
{
static void call_it()
{
F(0);
}
};
class MyClass
{
public:
static void callMe(int k)
{
}
};
int main()
{
FunctionWrapper<&MyClass::callMe> obj;
obj.call_it();
}
关于你的尝试,这就是C ++ 11标准第14.1 / 4段规定的要求:
非类型模板参数应具有以下(可选的cv限定)类型之一:
- 整数或枚举类型,
- 指向对象的指针或指向函数的指针,
- 对对象的左值引用或对函数的左值引用,
- 指向成员的指针,
- std :: nullptr_t。
指向成员函数的指针(即使static
)不是非类型模板参数的选项。