Considérons les deux extraits de code suivants, Le premier :
#include "pch.h"
#include <memory>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class tcp_connection : public std::enable_shared_from_this<tcp_connection>
{
public:
typedef std::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
//second example only differs by replacing the above line with the below one
//return std::make_shared<tcp_connection>(io_service);
}
private:
tcp_connection(boost::asio::io_service& io_service) //private constructor
: socket_(io_service)
{
}
tcp::socket socket_;
};
int main()
{
return 0;
}
La seconde ne diffère de la première que par une ligne, à savoir la ligne commentée.
Avec MSVC 2017 et boost::asio 1.68, la première version fonctionne comme prévu, tandis que la seconde ne compile pas, et génère des erreurs telles que "incomplete type is not allowed tcp_async".
Ma question est la suivante :
- Est-ce parce que std::make_shared ne joue pas le jeu de std:std::enable_shared_from_this ?
- Ou bien, c'est parce que les hypothèses que asio retient sur la façon dont std::make_shared ou std::enable_shared_from_this sont implémentés, ne sont pas valables avec MSVC 2017.
- Ou c'est autre chose ?