Проблема в коде, который вы показываете, связана с тем, что конструктор вашего типа является приватным.
Когда вы пишете new tcp_connection(io_service)
, конструктор упоминается в самой области действия tcp_connection
, которая имеет доступ.
Однако std::make_shared
(или какие-либо подробности реализации, которые он может использовать) не имеет доступа к закрытому конструктору, поэтому он не может инициализировать объект, для которого предназначен общий указатель.
Если инициализация правильно сформирована, std::make_shared
прекрасно работает с std::enable_shared_from_this
, но закрытый конструктор делает ее некорректной.
Обходной путь для решения этой проблемы - использование идиома Passkey . Который сводится к общедоступному c'tor, но тот, который принимает параметр частного типа. Хотелось бы что-то вроде этого 1 :
class tcp_connection2: public std::enable_shared_from_this<tcp_connection2>
{
struct key{ explicit key(){} };
public:
typedef std::shared_ptr<tcp_connection2> pointer;
static pointer create(int io_service)
{
return std::make_shared<tcp_connection2>(io_service, key{});
}
tcp_connection2(int io_service, key) //private constructor, due to key
{
}
};
1 - Я немного изменил определение вашего класса, чтобы другим было проще скопировать, вставить и протестировать его. Но тот же принцип может быть применен к вашему коду.