1

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

4

2 回答 2

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;}
于 2014-03-13T03:23:28.157 回答
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
        }
}
于 2016-07-23T11:37:00.027 回答