Судя по всему, сегодня MSVC изо всех сил пытается убедить меня перейти на clang. Но я не сдамся. Ранее я задавал этот вопрос интересно, как объявить std::make_unique
как friend
моего класса.
Я получил довольно хороший ответ на свой простой сценарий, и действительно, когда я попробовал его с clang на wandbox он скомпилирован просто отлично.
Так что я счастлив вернуться в Visual Studio 2013, чтобы продолжить кодирование. Часть моего кода такова:
// other includes
#include <string>
#include <memory>
template <typename Loader, typename Painter, typename MeshT>
class Model
{
public:
friend std::unique_ptr<Model> std::make_unique<Model>(
const std::string&,
const std::shared_ptr<Loader>&,
const std::shared_ptr<Painter>&);
// Named constructor
static std::unique_ptr<Model> CreateModel(
const std::string& filepath,
const std::shared_ptr<Loader>& loader,
const std::shared_ptr<Painter>& painter)
{
// In case of error longer than the Lord of the Rings trilogy, use the
// line below instead of std::make_unique
//return std::unique_ptr<Model>(new Model(filepath, loader, painter));
return std::make_unique<Model>(filepath, loader, painter);
}
// ...
protected:
// Constructor
Model(
const std::string& filepath,
const std::shared_ptr<Loader>& loader,
const std::shared_ptr<Painter>& painter)
: mFilepath(filepath)
, mLoader(loader)
, mPainter(painter)
{
}
// ...
};
Ладно, если честно, я не ожидал, что с первого раза все получится, но был уверен, что смогу разобраться в сообщении об ошибке:
1>d:\code\c++\projects\active\elesword\src\Model/Model.hpp(28): error C2063: 'std::make_unique' : not a function
1> ..\..\src\Main.cpp(151) : see reference to class template instantiation 'Model<AssimpLoader,AssimpPainter,AssimpMesh>' being compiled
Судя по всему, MSVC не думает, что std::make_unique
функция является... ну... функцией.
Хуже всего то, что я устал, и у меня такое чувство, что я упускаю что-то очень-очень (...) очевидное. Может ли кто-нибудь помочь мне расклеиться?
Кроме того, может ли кто-нибудь попробовать это с Visual Studio 2015? Просто из любопытства..
Примечание. Я знаю, что мог бы (и, вероятно, должен) просто использовать return std::unique_ptr<Model>(new Model(filepath, loader, painter));
, но мне кажется, что это неправильно.
make_unique
, а затем изменю объявление друга наfriend std::unique_ptr<A> my::make_unique<A, T&>(T&);
, как в следующем примере, он скомпилируется в MSVC - coliru.stacked-crooked.com/a/a036bc575b552665 - person Praetorian   schedule 25.11.2015