我正在尝试创建一个模板函数,它接受指向成员函数(非虚拟)的指针。我正在使用 MSVC2010
以下代码在有问题的行被注释掉时有效。编译器报告的错误非常解释,但我不知道不知何故仍然令人惊讶。你会如何建议解决这个问题。
谢谢!
class Foo{
public:
virtual void doFoo() {
std::cout << "In foo" << std::endl;
}
};
class Bar : public Foo{
public:
void doBar() {
std::cout << "In bar" << std::endl;
}
};
template<class A>
void caller(A &a, void (A::*func)()) {
(a.*func)();
}
int _tmain(int argc, _TCHAR* argv[])
{
Bar bar;
bar.doFoo();
caller(bar, &Bar::doBar);
caller(bar, &Bar::doFoo); // this line causes a compiler error
}
这会因以下错误而失败。
error C2782: 'void caller(A &,void (__thiscall A::* )(void))' : template parameter 'A' is ambiguous
1> c:\test\test\test.cpp(23) : see declaration of 'caller'
1> could be 'Foo'
1> or 'Bar'
我可以通过将调用者更改为来解决该错误
template<class A, class B>
void caller(A &a, void (B::*func)()) {
(a.*func)();
}
但这在考虑重载决议时会引入其他微妙的决议错误。理想情况下,我只想考虑实际上可以应用于 A 的函数。
谢谢!