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

这种问题可以通过两种方式解决:

  • 您可以显式地指定模板类型,但是在这种特殊情况下无法完成,因为在C++中无法将模板参数显式传递给构造函数,因为构造函数没有名称(根据c++标准§14.5.2.5中的说明) )。
  • 将适当类型的参数传递给函数。在这种情况下,只需将函数转换为适当的类型,例如static_cast<void (TargetClassChild::*)()>(&TargetClassChild::f)
  • 07-24 21:28