3

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

ありがとう!

4

2 に答える 2

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ます。

于 2012-08-11T21:35:56.540 に答える
1

func1andfunc2を非型のテンプレート引数として渡す理由がわかりません。

それらを(テンプレート引数ではなく)引数として渡し、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 は手元にありませんが、コンパイルする必要があります。

于 2012-08-11T21:36:11.397 に答える