template <typename... Arguments>
class CCallback
{
public:
template <class TargetClass>
CCallback(TargetClass * target, void (TargetClass::*targetMethod)(Arguments...))
{
}
};
struct TargetClassBase
{
protected:
void f() {}
};
struct TargetClassChild : TargetClassBase
{
void g() {}
void test()
{
CCallback<> callback(this, &TargetClassChild::f);
}
} child;
void main()
{
}
该代码无法在MSVC 2013中编译:
我不明白为什么会收到此特定错误以及如何使其正常工作。没有有关编译器记录的错误的更多详细信息。
而且,当然,我不能正确地指定该方法属于基类(
&TargetClassBase::f
)-禁止使用指向非公共(public)基方法的指针。 最佳答案
您的代码存在问题,编译器无法在TargetClass
的构造函数中推断出模板类型CCallback
。这是因为您将类型:TargetClassChild*
和void (TargetClassBase::*)()
的参数传递给构造函数。这不是错字。即使您编写&TargetClassChild::f
,该表达式仍然具有以下类型:指向函数的指针,该函数在类 TargetClassBase 中返回void,而不是像人们期望的那样 TargetClassChild 。
这种问题可以通过两种方式解决:
static_cast<void (TargetClassChild::*)()>(&TargetClassChild::f)