9

shared_ptrSTLを多用する C++ コードがあります。一般的なヘッダーは言う

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

gcc 4.6 with を使用して、言語機能を利用するために c++0x に切り替えたいと思いました-std=c++0x。ただし、現在もあり、未指定( vs )std::shared_ptrのあいまいさにつながります。shared_ptrboost::shared_ptrstd::shared_ptr

std::shared_ptr代わりに切り替えると、次のようになります。

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

次に、で問題が発生しています。これは、 (少なくともさらにいじることなく)のみboost::pythonでうまく動作しますboost::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>&)'

したがって、私の質問は

  • boost::shared_ptrとの間のあいまいさを解決する簡単な解決策がある場合std::shared_ptr(今のところ c++0x を使用しないこと以外)、また
  • ifは最終的に;boost::shared_ptrの単なるエイリアスになります。std::shared_ptrそれは私の問題を自動的に解決します。

ありがとう!

4

1 に答える 1

3

Boost Python で動作するには、共有ポインタ クラスの独立した関数 'get_pointer' を定義する必要があります。(これにより、独自の共有ポインターを作成し、Boost Python で作業できることに注意してください。これは、個別の Boost ライブラリの密結合を防ぐための意識的な設計努力です)

ブースト tr1 互換ヘッダーを使用すると、それが得られるかもしれませんが、私は試していません。

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

Boost.TR1 が標準ライブラリのネイティブ TR1 実装を利用するように構成されている場合、あまり機能しません。適切なヘッダーが含まれているだけです。

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

標準準拠のヘッダー インクルード (boost/tr1/tr1 内) を使用する場合、これらのヘッダー名が既存の標準ライブラリ ヘッダーと競合することがあります (たとえば、shared_ptr が独自のヘッダーではなく、既存の標準ライブラリ ヘッダーに追加されます)。これらのヘッダーは、次の 2 つの方法のいずれかで既存の標準ライブラリ ヘッダーに転送されます。gcc の場合は #include_next を使用し、他のコンパイラの場合は、評価するマクロ BOOST_TR1_STD_HEADER(header) (boost/tr1/detail/config.hpp で定義) を使用します。 #include <../include/header> に。これは、ほとんどのコンパイラで「すぐに」機能するはずですが、コンパイラの検索パスに既に存在する「include」と呼ばれるディレクトリ内にこれらのヘッダーを配置しないでください。

于 2011-07-04T08:27:00.643 に答える