0

少し前に、Boost.Extension の例で遊んでいました。彼らは使用した

  std::map<std::string, factory<computer> > computers;
  computers.swap(types.get());

しかし、プロジェクトを bjam から premake から Visual Studio プロジェクト 2008に移植し始めたとき、マップの作成に使用された方法を使用できないことがわかりました。その行で常にコンパイラ エラー C2512が発生しました (実際にはBoost.Extension type_map.hpp 内の 74 行目)。だから私は地図へのリンクを作成する方法を使用しました

map<string, factory<computer> >& computers(types.get());

(彼らはいくつかのチュートリアルで使用しました)そしてそれはすべてコンパイルされました。私は C++ にまったく慣れていないため、おそらく多くのことを理解していません。

では、この場合と一般的に、リンクからの地図の作成と単純な地図の作成の違いは何ですか?

更新 - 完全なエラー メッセージ

エラー 1 エラー C2512: boost::extensions::basic_type_map::type_map_convertible::type_holder: 適切なデフォルト コンストラクターがありません c:\users\avesta\downloads\extension-svn-source\boost\extension\type_map.hpp 74 Mltiple-Inheritance

4

1 に答える 1

3

違いは、2 番目のケースではマップがまったく作成されないことです。既に存在するマップへの参照を作成します。typesマップを含み、types.get()そのマップへの参照を返します。これを使用して、独自の参照を初期化します。その参照を使用してマップを変更すると、 に含まれるマップが変更されtypesます。

最初のケースでは、空のマップが作成されます。次に、 に含まれる (おそらく空ではない) マップと交換し、後で空typesのままにします。typesこれには、関連するさまざまなクラスからのサポートがさらに必要になります。一部は、デフォルトで構築可能、交換可能、場合によってはコピー可能および/または割り当て可能である必要がある場合があります。エラー コードは、クラスの 1 つにパブリックの既定のコンストラクターが必要であることを示しているようですが、それがありません。エラー メッセージ全体を含めると、問題の診断に役立つ場合があります。

于 2011-04-26T11:25:21.157 に答える