次のコードを検討してください。
class Foo {
public:
void foo() {}
void foo(double d) {}
};
template <typename Fun>
void bar_simple(Fun fun) {}
template <typename Base>
struct Wrapper {
template <typename Type>
static void bar(Type Base::* fun) {}
};
template <typename Type, typename Base>
void bar(Type Base::* fun) {}
int main() {
//ok
bar_simple<void(Foo::*)()>(&Foo::foo);
bar_simple<void(Foo::*)(double)>(&Foo::foo);
//ok
Wrapper<Foo>::bar<void()>(&Foo::foo);
Wrapper<Foo>::bar<void(double)>(&Foo::foo);
//yields: error C2784: 'void bar(Type Base::* )' :
//could not deduce template argument for 'overloaded function type'
//from 'overloaded function type'; see declaration of 'bar'
bar<void()>(&Foo::foo);
bar<void(double)>(&Foo::foo);
return 0;
}
上記のコードは、gcc-4.3.4 および comeau 4.3.10.1 でコンパイルされ、Visual C++ 9.0 および 10.0 の両方で失敗します。これはバグのようです。MS の「バグトラッカー」に適切なバグレポートが存在することをご存知ですか?