gpt4 book ai didi

c++ - 获取指向基类的 protected 方法的指针并将其传递给不同的类

转载 作者:行者123 更新时间:2023-11-30 05:49:18 29 4
gpt4 key购买 nike

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 中编译:

error C2660: 'CCallback<>::CCallback' : function does not take 2 arguments

我不明白为什么会出现这个特定错误,以及如何让它发挥作用。没有关于编译器记录的错误的更多详细信息。

当然,我无法正确指定该方法属于基类 (&TargetClassBase::f) - 禁止使用指向非公共(public)基类方法的指针。

最佳答案

您的代码存在问题,编译器无法推断模板类型 TargetClassCCallback 的构造函数中.这是因为您传递了以下类型的参数:TargetClassChild*void (TargetClassBase::*)()到构造函数。这不是错字。即使你写 &TargetClassChild::f此表达式仍然具有类型:指向类 TargetClassBase 中返回 void 的函数的指针,而不是人们所期望的 TargetClassChild

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

  1. 您可以显式指定模板类型,但在这种特殊情况下不能这样做,因为在 C++ 中无法将模板参数显式传递给构造函数,因为构造函数没有名称(根据 §14.5.2.5 中的注释) c++ 标准)。
  2. 将适当类型的参数传递给函数。在这种情况下,只需将您的函数转换为适当的类型即可 static_cast<void (TargetClassChild::*)()>(&TargetClassChild::f)

关于c++ - 获取指向基类的 protected 方法的指针并将其传递给不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799539/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com