当我尝试编译此代码时,我在 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)'