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