0

互いに組み合わせて使用​​される 2 つのメソッドを持つ API があるとします。

boost::shared_ptr<IAsset> getAsset( const std::string & id );
void update( const Asset & asset );

boost::shared_ptr<Asset> asset私は別のクラスにメンバー変数を持っています。私が行った場合:

asset = otherObject->getAsset("first_asset");

// do some stuff

otherObject->update( *asset );

次のエラーが表示されます。

      \boost\include\boost/smart_ptr/shared_ptr.hpp(378): error C2440: '<function-style-cast>' : cannot convert from 'boost::shared_ptr<T>' to 'boost::shared_ptr<T>'
      with
      [
          T=IAsset
      ]
      and
      [
          T=Asset
      ]
      No constructor could take the source type, or constructor overload resolution was ambiguous
      src\TestMethod.cpp(35) : see reference to function template instantiation 'boost::shared_ptr<T> &boost::shared_ptr<T>::operator =<IAsset>(boost::shared_ptr<IAsset> &&)' being compiled
      with
      [
          T=Asset
      ]
      \boost\include\boost/smart_ptr/shared_ptr.hpp(378): error C2228: left of '.swap' must have class/struct/union

Assetここで、 のクラス定義は次のように拡張IAssetされることに注意してください。class Asset : virtual public IAsset {...}

基になる API にアクセスできないため、誰かがこれを行う正しい方法を教えてもらえますか?

4

3 に答える 3

2

これは潜在的に安全でない変換であるため、動的ポインタ キャストを使用する必要があります。

static_cast(仮想基本クラスの aは使用できないことに注意してください。)

于 2012-04-16T13:52:18.197 に答える
1

継承の使い方が間違っていると思います。updateが必要な場合は、またはそのサブクラスAssetを送信する必要があります。スーパークラスです。AssetIAsset

于 2012-04-16T13:52:12.983 に答える
1

ダウンキャストが必要な に をキャストIAssetしているためです。Asset

于 2012-04-16T13:52:14.950 に答える