模板化方法与指向继承方法的模板化函数指针一起使用的问题
Issues with templated methods used with templated function pointer to an inherited method
我似乎无法弄清楚特定模板化方法发生了什么。
一个类似的模板化方法已经在我的代码库中存在了一段时间,并且以与 Bar::Bar(IFoo&)
相同的方式使用,唯一的区别是传入的函数是继承的。
我有一个接口 IFoo
,它定义了相关的模板函数。
struct IFoo {
template<class T>
void doSomething(bool (T::*method)(int), T *instance) {
std::cout << (instance->*method)(5) << "\n";
}
};
我有一个 class 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
需要相同。您可以通过强制转换 this
:
来帮助编译器进行推导
int main() {
Bar b;
IFoo foo;
foo.doSomething(&Bar::setValue, static_cast<Parent*>(&b));
}
感谢 JVApen 指出您可以通过允许两种不同的类型使 doSomething
更通用,并让 Callback
进行转换:
template<class T, class U>
void doSomething(bool (T::*method)(int), U *instance);
我似乎无法弄清楚特定模板化方法发生了什么。
一个类似的模板化方法已经在我的代码库中存在了一段时间,并且以与 Bar::Bar(IFoo&)
相同的方式使用,唯一的区别是传入的函数是继承的。
我有一个接口 IFoo
,它定义了相关的模板函数。
struct IFoo {
template<class T>
void doSomething(bool (T::*method)(int), T *instance) {
std::cout << (instance->*method)(5) << "\n";
}
};
我有一个 class Bar
是另一个 class
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
需要相同。您可以通过强制转换 this
:
int main() {
Bar b;
IFoo foo;
foo.doSomething(&Bar::setValue, static_cast<Parent*>(&b));
}
感谢 JVApen 指出您可以通过允许两种不同的类型使 doSomething
更通用,并让 Callback
进行转换:
template<class T, class U>
void doSomething(bool (T::*method)(int), U *instance);