2012-04-16 2 views
0

Предположим, что у меня есть API, который имеет 2 метода, которые должны быть использованы в сочетании друг с другом:импульс shared_ptr интерфейс/объект

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?

ответ

1

Я думаю, что ваше использование наследования неверно. Если update требует Asset, вам необходимо либо отправить его Asset, либо его подкласс. IAsset - суперкласс.

1

Потому что вы отливаете IAsset в Asset, который требует понижения.

2

Это потенциально опасное преобразование, поэтому вам нужно будет использовать dynamic pointer cast.

(Обратите внимание, что вы не можете использовать static_cast из виртуального базового класса.)

Смежные вопросы