C++11/14 make_unique неоднозначная перегрузка для std::string

Может ли кто-нибудь объяснить, как устранить неоднозначное предупреждение о перегрузке для make_unique, откуда возникла ошибка и что именно это означает (я понимаю, что такое неоднозначная перегрузка, но я не уверен, почему я получаю ее для этого конкретного кода)? Я использую C++11, поэтому я использую рекомендованный шаблон от Херба Саттера.

Используя его, я получаю следующую ошибку:

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 ответа

Решение

Звонок неоднозначный, потому что у вас есть std::make_unique, как показывает содержание подсказки, которую вы цитируете. И хотя ты не написал std::, так как вы передаете std::string зависимый от аргумента поиск включается для автоматического поиска в этом пространстве имен.

Когда вы говорите "Я использую C++11", это не совсем правильно, потому что Visual Studio не позволяет вам выбирать, какой стандарт писать. Он просто предоставляет вам новейшую поддержку, которую он испытал для любой данной функции. И, по-видимому, Visual Studio 2013 имеет C++14 std::make_unique,

Убери свое.

Казалось бы, это невозможно сделать в визуальной студии.

Это ошибка.

Лучше всего, в соответствии с этим вопросом, как определить, собираю ли я код с Visual Studio 2008? продолжайте использовать различные #ifdefs для обработки случаев, когда Visual Studio все еще слишком мусор, чтобы поддерживать базовые функции.

Использование:

#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
Другие вопросы по тегам