C++ MSVC抱怨函数指针不是编译时常量

C++ MSVC抱怨函数指针不是编译时常量,c++,visual-c++,C++,Visual C++,我试图获取一些最初使用GCC构建的代码,以便使用MSVC进行编译,但代码中的回调包装器类遇到了问题。我提取了下面代码的关键部分: template <typename T_func> struct internal_parameter_resolver; template <typename R> struct internal_parameter_resolver<R()> { typedef R(*type)(); }; template &l

我试图获取一些最初使用GCC构建的代码,以便使用MSVC进行编译,但代码中的回调包装器类遇到了问题。我提取了下面代码的关键部分:

template <typename T_func>
struct internal_parameter_resolver;

template <typename R>
struct internal_parameter_resolver<R()> {
    typedef R(*type)();
};

template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
    typedef R(*type)(P1);
};

template <typename T_func, typename internal_parameter_resolver<T_func>::type func>
void bind() {
    // Create and return instance of class Callback...
}

double func1() { return 0.5; }
int func2(double i) { return 0; }

int main() {
    bind<double(), &func1>();    // (Line 23)
    bind<int(double), &func2>(); // (Line 24)

    return 0;
}
有人知道为什么MSVC认为那些函数指针不是编译时常量吗?或者问题在代码的其他地方(即,不是第23行和第24行)?如果它是编译器中的一个bug,我将欢迎任何关于可能的解决方法的建议

谢谢

模板
template <typename T_func, T_func* >
void bind() {
    // Create and return instance of class Callback...
}
无效绑定(){ //创建并返回类回调的实例。。。 }

Visual C++不利于解决间接类型定义,但它更适合于更具体的类型,如上面的。

以上说明了用VisualC++ ++对直接问题的处理。 但是,更好的设计是使用自动模板参数推断:

template <typename T_func >
void bind( T_func const func ) {
    // Create and return instance of class Callback...
}

double func1() { return 0.5; }
int func2(double i) { return 0; }

int main() {
    bind( func1 );      // (Line 23)
    bind( func2 );      // (Line 24)
}
模板
无效绑定(T_func const func){
//创建并返回类回调的实例。。。
}
double func1(){return 0.5;}
int func2(双i){返回0;}
int main(){
绑定(func1);/(第23行)
绑定(func2);/(第24行)
}

如果需要,您可以从
std::function
获取函数结果类型,依此类推。

我认为没有任何理由将
func1
func2
作为非类型模板参数传递

最好将它们作为参数(而不是模板参数)传递,并让
内部参数\u解析器
trait推断其类型:

template <typename T_func>
struct internal_parameter_resolver;

template <typename R>
struct internal_parameter_resolver<R()> {
    typedef R(*type)();
};

template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
    typedef R(*type)(P1);
};

template <typename T_func>
void bind(typename internal_parameter_resolver<T_func>::type func) {
    // Create and return instance of class Callback...
}

double func1() { return 0.5; }
int func2(double i) { return 0; }

int main() {
    bind<double()>(func1);    // (Line 23)
    bind<int(double)>(func2); // (Line 24)

    return 0;
}
模板
结构内部参数分解器;
模板
结构内部参数解析程序{
类型定义R(*类型)();
};
模板
结构内部参数解析程序{
类型定义R(*类型)(P1);
};
模板
无效绑定(类型名称内部参数解析程序::类型func){
//创建并返回类回调的实例。。。
}
double func1(){return 0.5;}
int func2(双i){返回0;}
int main(){
绑定(func1);/(第23行)
绑定(func2);/(第24行)
返回0;
}

我手头没有VC,但应该可以编译。

使用gcc 4.6和&clang 3.1编译得很好。@mfontanini是的,我知道,是MSVC给我带来了问题。哇,它真的很简单(使用t_func*)!不幸的是,我不能使用自动模板参数推断,因为回调类的实例化需要函数指针作为模板参数。谢谢感谢您的建议,不幸的是,回调类的实例化要求函数指针是模板参数(它基于中描述的轻量级回调)。
template <typename T_func>
struct internal_parameter_resolver;

template <typename R>
struct internal_parameter_resolver<R()> {
    typedef R(*type)();
};

template <typename R, typename P1>
struct internal_parameter_resolver<R(P1)> {
    typedef R(*type)(P1);
};

template <typename T_func>
void bind(typename internal_parameter_resolver<T_func>::type func) {
    // Create and return instance of class Callback...
}

double func1() { return 0.5; }
int func2(double i) { return 0; }

int main() {
    bind<double()>(func1);    // (Line 23)
    bind<int(double)>(func2); // (Line 24)

    return 0;
}