当我尝试编译此代码时,我在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)'
答案 0 :(得分:0)
因为这显然是编译器本身的一个错误,我所能做的就是创建一个解决方法来达到同样的效果。
我删除了默认参数并使用了重载方法,如下所示:
template<typename T> inline void set_func() {this->f=bar::foo<T>;}
template<typename T> inline void set_func(void(*f)()) {this->f=f;}
答案 1 :(得分:0)
解决此问题的另一种方法。
typedef void (*FunctionPointer)(int, int);
class Template
{
public:
template<typename Type>
static void Function(int Arg0, int Arg1)
{
// Code and Stuff
}
// ORIGINAL FUNCTION - Produces compile errors.
// Produces - error C2440: 'default argument' : cannot convert from 'overloaded-function' to 'FunctionPointer' (VS2012 SP5 x64)
template<typename Type>
void Original(FunctionPointer Arg = &Template::Function<Type>)
{
// Code and Stuff
}
// WORKAROUND FUNCTION - Compiles fine.
// Default Arg parameter to NULL and initialize default parameter inside function on runtime.
template<typename Type>
void Original(FunctionPointer Arg = NULL)
{
if (Arg == NULL)
Arg = &Template::Function<Type>;
// Code and Stuff
}
}