2017-11-02 16 views
1

私は4.4.1がラムダ式をサポートしていないので、gccコンパイラを4.9.2から4.4.1にダウングレードしました。次のコードでは、ラムダ式[](void*d){ dlclose(d); }が使用され、ラムダ式に起因するエラーが発生します。誰もラムダ式なしで以下のコードを使用する方法を助けることができますか?ラムダ式相当のC++コード

using libs_t = std::unique_ptr<void,std::function<void(void*)>>; 

私はちょうどdlcloseを試し以下で上記の行を置き換えますが、それはまた、GCC 4.4.1

typedef std::unique_ptr<void,std::function<void(void*)>> libs_t ; 

m_libs[ lib_name ] = libs_t (handle, [](void*d){ dlclose(d); }); 
+0

コンパイラはstd関数をサポートしていますか? – Yakk

+1

@ user3906620ラムダ式のような本体を持つ関数を定義する –

+0

はいそれはstdをサポートします – user3906620

答えて

1

でサポートされていません。

いいえ、本当に。 void戻り値の問題に遭遇する可能性がありますが、その場合は書き込みを行います。

void mydlclose(void* p){ dlclose(p); } 

mydlcloseを使用してください。

3

かわりstd::functionの生の関数ポインタを受け入れるようにunique_ptr特化を再定義することができます。この場合はstd::function

typedef std::unique_ptr<void, int (*)(void *)> libs_t ; 
libs_t(handle, &dlclose); 

使用すると、それに格納されることになっている項目だけがポインタであるため、冗長であると思われますdlcloseに機能します。

+0

上記の変更の後、エラーが静的アサーションに失敗しました: "null関数ポインタ・デリータで構築されました" – user3906620

+0

@ user3906620これは、デフォルト・コンストラクタを使用して 'libs_t'インスタンスを作成していることを意味します。 deleterが関数へのポインタである場合、これは禁止されています。これを修正するには、nullptrと 'dlclose'へのポインタをパラメータとして提供する' libs_t'インスタンスを作成します。 – VTT