我有这个问题:
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);
}
};为什么我可以使用函数指针(编译时间常量),而不能使用类成员(甚至静态)指针?
发布于 2013-03-02 23:25:07
为什么我可以使用函数指针(编译时间常量),但不能使用类成员(甚至静态)指针?
您可以将指向静态函数的指针用作常规函数指针。例如,下面的代码可以工作:
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)不是非类型模板参数的选项。
发布于 2013-03-02 23:24:53
静态函数具有与普通函数相同的类型签名;它不是真正的成员函数。
https://stackoverflow.com/questions/15176060
复制相似问题