显然,今天,MSVC 正在尽最大努力说服我改用 clang。但我不会放弃。早些时候我问过这个问题,想知道如何声明std::make_unique
为friend
我的班级。
在我的简单场景中,我得到了一个很好的答案,事实上,当我在wandbox上使用 clang 尝试它时,它编译得很好。
所以我很高兴回到 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
函数是..well..a 函数。
最糟糕的是我累了,我觉得我错过了一些非常非常非常(...)明显的东西。谁能帮我解开?
另外,任何人都可以用 Visual Studio 2015 试试这个吗?只是出于好奇。。
注意:我知道我可以(并且可能应该)只是使用return std::unique_ptr<Model>(new Model(filepath, loader, painter));
,但感觉不对。