2012-11-03 13 views
7

extern "C"関数ポインタの型を宣言したいと考えています。これはメンバ変数です。 this questionの構文私はコンパイルすることができません。メンバをextern "C"関数へのポインタとして宣言するには?

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

私は両端にextern "C"を置くことを試し、そしてtypedeftypenametypefunc_ptr_type間が、コンパイラ間のすべてを拒否してきました。助言がありますか?

+0

'extern" C "'エイリアステンプレートでは、これはうまくいくでしょう。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

ところで '' extern "C" 'にするには' Sig'が必要です。関数型へのポインタの追加にはリンケージはありません。関数型そのものです。関数型を作成するときにリンケージを誘導します。既存の関数型に名前を付けるときではなく、既存の型にはそれが持つリンケージがあります。 –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801問題は少なくなりますが問題はあります。 – Puppy

答えて

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で動作します。ゼオはit didn’t work in GCCを指摘した。これがどちらのコンパイラのバグなのか分かりませんので、これを使うときは注意してください。

0

あなたは(7.5p4から)そのような型定義を宣言することができない。

リンケージ仕様のみ名前空間範囲(3.3)で発生しなければなりません。

関連する問題