我正在尝试使用最初使用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;
}
虽然这在GCC下编译得很好,但MSVC 2010会给出以下错误消息:
1>c:\users\public\documents\projects\_test\_test\main.cpp(23): error C2975: 'func' : invalid template argument for 'bind', expected compile-time constant expression
1> c:\users\public\documents\projects\_test\_test\main.cpp(14) : see declaration of 'func'
1>c:\users\public\documents\projects\_test\_test\main.cpp(24): error C2975: 'func' : invalid template argument for 'bind', expected compile-time constant expression
1> c:\users\public\documents\projects\_test\_test\main.cpp(14) : see declaration of 'func'
有没有人知道为什么MSVC认为那些函数指针不是编译时常量?或者是代码中的其他地方(即第23和24行不是)?如果这是编译器中的错误,我欢迎任何关于可能的解决方法的建议。
谢谢!
答案 0 :(得分:2)
template <typename T_func, T_func* >
void bind() {
// Create and return instance of class Callback...
}
Visual C ++不适合解析间接类型定义,但它更喜欢更具体的类型,如上所述。
以上显示了使用Visual C ++如何处理直接问题。
然而,稍微好一点的设计是使用自动模板参数推导:
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)
}
您可以从std::function
获取功能结果类型,如果需要,依此类推。
答案 1 :(得分:1)
我认为没有理由将func1
和func2
作为非类型模板参数传递。
最好将它们作为参数传递(而不是模板参数),并让internal_parameter_resolver
特征推断出它的类型:
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;
}
我手头没有VC,但应该编译。