Чтобы сделать вышеупомянутую компиляцию:
Добавьте заголовки:
#include <string>
#include <memory>
Вы также должны иметь возможность создать A
, поэтому вам нужно сделать конструкторы общедоступными:
class A //abstract class
{
public: // Added this:
A() = default;
.....
};
Ваша главная проблема заключается в создании общего объекта.
obj2(std::make_shared<SI::Z>(SI::Z(p,"hi")))
Вам не нужно создавать здесь объект SI::Z
(так как он не копируется, это проблема). Что вы хотите сделать, это передать аргументы, которые будут использоваться для создания SI::Z
объекта. Затем std::make_shared()
вызовет new и перенаправит эти параметры в конструктор.
obj2(std::make_shared<SI::Z>(p, "hi")) // Notice the diff?