2011-07-04 37 views
7

shared_ptrとSTLを頻繁に使用するC++コードがあります。共通ヘッダはC++ 0x std :: shared_ptr対boost :: shared_ptr

#include<boost/shared_ptr.hpp> 
using boost::shared_ptr; // for shared_ptr 
using namespace std;  // for STL 

は、私はCに切り替えたかっ++ 0xのは今-std=c++0xでのgcc 4.6を使用して、言語機能を利用することを言います。しかし、std::shared_ptrもあり、不特定のためのあいまいさにつながる。shared_ptrboost::shared_ptrstd::shared_ptr)。

このように、代わりにstd::shared_ptrへの切り替え:

/usr/include/boost/python/object/make_ptr_instance.hpp:30:52: error: no matching function for call to 'get_pointer(const std::shared_ptr<Cell>&)' 

マイ:

#include<memory> 
using namespace std;  // for STL; also imports std::shared_ptr 

その後、私は(少なくともさらにいじるなし)boost::shared_ptrでapprently作品boost::pythonで問題が発生し、取得しています質問があるので

  • もしther boost::shared_ptrは最終的にstd::shared_ptrのためだけのエイリアスになる場合eは(今のところC++ 0xのを使用していない以外)boost::shared_ptrstd::shared_ptr間のあいまいさを解決するためのシンプルなソリューションであり、また
  • 。それは私の問題を自動的に解決します。

ありがとう!

+0

PS。ブースト1.42を使用します。 – eudoxos

+7

解決策はおそらく 'using namespace std'を一掃することでしょう。そして、すべてのstl要素に対してグローバルな検索と置換を行うのと同じくらい簡単なことができます。 – stijn

+0

そうですね、これは解決策ですが、STLは頻繁に使用されるため、コードが読みにくくなります。おそらく私は 'std :: stringを使ってたくさん書いてみることができます。 std :: vectorを使用します。 'などの宣言を共通ヘッダーに入れます。実際には多くの 'std ::'パーツは使用されていませんが、頻繁に使用されます。 – eudoxos

答えて

2

Boost Pythonで動作するためには、共有ポインタクラスのフリースタンディング関数 'get_pointer'を定義する必要があります。 (これにより、独自の共有ポインタを作成し、Boost Pythonで動作させることができます。これは、Boostライブラリのタイトな結合を防ぐための意識的な設計作業です)

boost tr1互換性ヘッダーを使用している可能性がありますが、試していません。それだけで適切なヘッダを含む :

http://boost.cowic.de/rc/pdf/tr1.pdf

Boost.TR1が、それはあまり行っていないあなたの標準ライブラリのネイティブTR1の実装を利用するように構成された

Boost.TR1が特定のコンポーネントのBoost実装を使用している場合、適切なBoostヘッダが含まれ、 宣言を使用してnamespace std :: tr1に必要な宣言がインポートされます。標準の の一部である宣言だけがインポートされることに注意してください。実装は、ユーザコードの移植性エラーをキャッチするために、 名前空間std :: tr1にBoost固有の拡張を含まないことについて故意に厳密です。 Boost固有の拡張機能を実際に使用する必要がある場合は、 を使用してください。ブーストヘッダーを直接インクルードし、代わりにnamespace boost ::の宣言を使用する必要があります。この実装スタイル は完全に標準に準拠していないことに注意してください。特に、 TR1コンポーネントのユーザ定義テンプレート特殊化を名前空間std :: tr1に追加することはできません。まだ完全に準拠していない1つまたは2つのBoostライブラリがあります。 このような不適合は、TR1のサブセクションで文書化されています。うまくいけば、非標準的な振る舞いの出現は実際には非常にまれであるはずですが です。

あなたは、標準準拠のヘッダは(ブースト/ TR1/TR1に)含まれて使用している場合は、これらのヘッダ名は時々例のshared_ptrのための既存の 標準ライブラリのヘッダーとの競合が(それは自分の だのではなく、既存の標準ライブラリのヘッダに付加されることができますヘッダ)。これらのヘッダーは、既存の標準ライブラリヘッダーに2つの方法のいずれかで転送されます:gccでは#include_next、 を使用し、その他のコンパイラーではBOOST_TR1_STD_HEADER(ヘッダー)(boost/tr1/detail/config.hppで定義)マクロを使用します。 #include < ../ include/header>を評価すると となります。これはほとんどのコンパイラではまっすぐに動作するはずですが、これらのヘッダは、コンパイラの検索パスに既に含まれている "include"というディレクトリの中に決して置かないでください。

+0

ありがとう! boost :: pythonではより複雑になると思っていました。さて、私はboost :: serializationも使用していますが、柔軟性がないようです(例:[this thread](http://stackoverflow.com/questions/4094604/boost-serialization-serialize-stdtr1shared-ptr)ブースト::シリアライズがboost :: shared_ptrに対して行うことをコピー&カスタマイズすることを提案しています。 – eudoxos

関連する問題