gpt4 book ai didi

c++ - 与指向继承方法的模板函数指针一起使用的模板方法的问题

转载 作者:行者123 更新时间:2023-12-04 08:21:04 27 4
gpt4 key购买 nike

我似乎无法弄清楚特定模板化方法发生了什么。
类似的模板化方法已经在我的代码库中使用了一段时间,并以与 Bar::Bar(IFoo&) 相同的方式使用。 ,唯一的区别是传入的函数是继承的。
我有一个接口(interface)IFoo它定义了有问题的模板化函数。

struct IFoo {
template<class T>
void doSomething(bool (T::*method)(int), T *instance) {
std::cout << (instance->*method)(5) << "\n";
}
};
我有课 Bar这是另一个类(class)的 child
struct Parent {
virtual bool setValue(int a) { return true; }
};
struct Bar : Parent { };
当我尝试使用 IFoo::doSomething编译器只是看不到匹配的函数
int main() {
Bar b;
IFoo foo;
foo.doSomething(&Bar::setValue, &b);
}
我收到以下编译器消息
错误:没有匹配函数调用“ IFoo::doSomething(bool (Parent::*)(int), Bar*)” '
我真正感到惊讶的是,我没有得到模板 IFoo::doSomething 的候选人建议。功能。
请仅使用 C++98 解决方案。

最佳答案

正如错误所说,Bar::setValue 的类型实际上是 bool (Parent::*)(int) .这会干扰 doSomething 的模板参数推导因为它有两个 T s 需要相同。您可以通过强制转换 this 来帮助编译器进行推断。 :

int main() {
Bar b;
IFoo foo;
foo.doSomething(&Bar::setValue, static_cast<Parent*>(&b));
}
Live Demo
感谢 JVApen 指出您也可以制作 doSomething通过允许两种不同的类型和让 Callback 更通用进行转换:
template<class T, class U>
void doSomething(bool (T::*method)(int), U *instance);

关于c++ - 与指向继承方法的模板函数指针一起使用的模板方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65497762/

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