shared_pointer базового класса не может быть создан с использованием полиморфного производного - PullRequest
1 голос
/ 10 октября 2011

У меня есть базовый полиморфный класс (с виртуальными методами) и производный от него. Я пытаюсь использовать следующий код

     boost::shared_ptr<base_class> ptr( new derived_class() );

но компилятор возвращает мне следующую ошибку

    cannot convert ‘fpga_northwest*’ to ‘fpga*’ in initialization
    make: *** [../obj/ixecute_cmd_interface.o] Error 1

Читая вокруг, я испытываю желание использовать следующее, которое строит нормально, но у меня есть некоторые сомнения. Вы думаете, что это правильно?

     boost::shared_ptr<base_class> ptr_base;
     boost::shared_ptr<derived_class> ptr_derived( new derived_class() );
     ptr_base = boost::dynamic_pointer_cast<base_class>( ptr_derived );

Если я использую boost::static_pointer_cast, у меня ошибка компилятора; так как я кастую из производного в базу не должно быть более правильным static_cast?

Спасибо за вашу помощь

Ответы [ 3 ]

5 голосов
/ 10 октября 2011
boost::shared_ptr<base_class> ptr( new derived_class() );

Это должно работать просто отлично.

Возможно, эти классы не связаны между собой?

Возможно, эти классы не завершены на этом этапе, поэтому компилятор не знает, чтоклассы связаны?(Это должно привести и к другой ошибке.)

3 голосов
/ 10 октября 2011

Это должно работать как заявлено первоначально. Производный_класс * будет успешно приведен к базовому_классу *, с помощью которого будет создан shared_ptr. Как указано, ideone тоже скомпилирует. Я полагаю, что-то не так с вашей установкой Boost или компилятором.

Или, как указано, остальная часть вашего кода.

1 голос
/ 10 октября 2011

Приведение типов необходимо для выполнения этого приведения, который реализуется через шаблон члена. Это не слишком хорошо поддерживается на старых компиляторах. Поэтому он отключен на этих компиляторах. Какой компилятор вы используете?

...