メンバー関数(非仮想)へのポインターを受け入れるテンプレート関数を作成しようとしています。私は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に適用できる関数のみを検討したいと思います。
ありがとう!