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

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));
}

Live Demo

感谢 JVApen 指出您可以通过允许两种不同的类型使 doSomething 更通用,并让 Callback 进行转换:

template<class T, class U>
void doSomething(bool (T::*method)(int), U *instance);