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 行目ではありません)。コンパイラのバグである場合は、可能な回避策についての提案を歓迎します。
ありがとう!