7

extern "C" 関数ポインターの型を宣言しようとしています。メンバー変数です。この質問の構文はコンパイルできません。

template<typename Sig> struct extern_c_fp {
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type;
};

extern "C"を両端、 と の間typedeftypenameと の間typeに配置して実験しましfunc_ptr_typeたが、コンパイラはすべてを拒否しました。助言がありますか?

4

2 に答える 2

1
extern "C" {
    template<typename R, typename... Args>
    using extern_c_fp = R(*)(Args...);
}

using my_function_ptr = extern_c_fp<void, int, double>;
// returns void, takes int and double

これはあなたが使用するのと同じインターフェースを使用しませんが、 の戻り値の型と引数の型を抽出する方法があるかもしれませんSig

これはclang 3.1で機能します。Xeoは、GCC では機能しないと指摘しました。これがどちらのコンパイラのバグなのかはわかりませんので、これを使用するときは注意してください。

于 2012-11-03T23:17:34.377 に答える
0

そのような typedef を宣言することはできません (7.5p4 以降):

リンケージ仕様は、名前空間スコープ (3.3) でのみ発生するものとします。

于 2012-11-03T22:42:11.023 に答える