このコードをコンパイルしようとすると、Visual Studio 2012 で次のコンパイラ エラーが発生します。
error C2440: 'default argument' : cannot convert 'void(_cdecl*)(void)' to 'void(_cdecl*)(void)'
私のコード:
namespace bar {
template<typename T> void foo();
template<> void foo<int>() {}
}
struct A {
void(*f)();
template<typename T> inline void set_func(void(*f)()=bar::foo<T>) {this->f=f;}
};
int main(void) {
A a;
a.set_func<int>();
return 0;
}
グローバル名前空間に移動bar::foo
すると、エラーが発生しなくなりました。誰でも説明できますか?
上記のコードを編集して、メンバー関数とテンプレートの特殊化に関する混乱を取り除きました。typedef も削除しました。これにより、同じエラーのさらに奇妙なバージョンが発生します。cannot convert 'void(_cdecl*)(void)' to 'void(_cdecl*)(void)'