c++11/14 make_unique std::string 的不明确重载

c++11/14 make_unique ambigious overload for std::string

有人可以解释一下如何解决 make_unique 的模棱两可的过载警告吗,错误来自何处以及它的确切含义(我确实理解模棱两可的过载是什么,但我不确定为什么会得到一个用于此特定代码)?我使用的是 c++11,因此我使用了 Herb Sutter 推荐的模板。

使用它时出现以下错误:

Error   4   error C2668: 'make_unique' : ambiguous call to overloaded function

悬停在 visual studio 13 中的工具提示上为我提供了以下方法:

function template "std::enable_if<!std::is_array<_Ty>::value, std::unique_ptr<_Ty,std::default_delete<_Ty>>>::type std::make_unique<_Ty,_Types...>(_Types &&..._Args)"
function template "std::unique_ptr<T, std::default_delete<T>> make_unique<T,Args...>(Args...)
argument types are: std::string

第二个应该是从make_unique模板中调用的那个

/* Will be part of c++14 and is just an oversight in c++11
 * From: http://herbsutter.com/gotw/_102/
 */
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique(Args&& ...args){
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

要转发给的构造函数:

Shader(const std::string& name);

产生错误的代码

std::string _name = "Shader";
std::unique_ptr<Shader> s = make_unique<Shader>(_name); 

调用不明确,因为您 std::make_unique,如您引用的工具提示内容所示。即使你没有写 std::,因为你传递的是 std::string argument-dependent lookup kicks in to search that namespace automatically.

当您说 "I am using C++11" 时,这不太正确,因为 Visual Studio 不允许您选择写入哪个标准。它只是为您提供它为任何标准收集的最新支持给定的特征。而且,显然,Visual Studio 2013 有 C++14 的 std::make_unique.

删除你的。