c ++ 11/14 make_unique std :: string的ambigious重载

时间:2015-02-15 00:28:51

标签: c++ templates c++11 c++14

有人可以解释一下如何解决make_unique的ambigious过载警告,其中错误来自及其确切意味着什么(我确实理解什么是一个ambigious重载但是我不确定为什么我得到一个这个特定的代码) ?我使用的是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); 

2 个答案:

答案 0 :(得分:2)

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

当你说&#34;我正在使用C ++ 11&#34;时,这是不对的,因为Visual Studio不允许你选择写入哪个标准。它只是提供你得到了它为任何特定功能提供的最新支持。而且,显然,Visual Studio 2013具有C ++ 14 std::make_unique

删除你的。

答案 1 :(得分:-2)

在visual studio中似乎无法做到这一点。

这是一个错误。

你最好的选择是,根据这个问题How to Detect if I'm Compiling Code With Visual Studio 2008?,继续使用各种#ifdef来处理视觉工作室仍然过于垃圾而不能支持基本功能的情况。

使用:

#if (_MSC_VER == 1500)
   // ... Do VC9/Visual Studio 2008 specific stuff
#elif (_MSC_VER == 1600)
   // ... Do VC10/Visual Studio 2010 specific stuff
#elif (_MSC_VER == 1700)
   // ... Do VC11/Visual Studio 2012 specific stuff
#endif