[英]Call to variadic template is ambigous
我有一個可變參數模板函數,除非我使用與T
相同類型的參數調用它。
template <typename T, typename... Arg>
std::shared_ptr<T> make_shared(Arg&&... arg)
{
return std::shared_ptr<T>(new T(std::forward<Arg>(arg)...));
}
工作電話:
auto sahredStr = make_shared<std::string>("fubar");
曖昧的電話:
std::string str = "fubar";
auto sharedStr = make_shared<std::string>(str);
我想了解第二次通話有什么問題。
對於使用非限定名稱調用函數,名稱查找過程還會考慮聲明參數類型(及其類型模板參數)的名稱空間 - 也稱為參數依賴查找 。 對於std::string
-typed參數,這意味着還在std
命名空間中搜索make_shared
函數。 因此,可行的重載集合還包括std::make_shared
函數,因此不明確。
解決方案是更改函數名稱以避免與std
的重載沖突,或者用括號包裝函數名稱:
auto sharedStr = (make_shared<std::string>)(str);
// ~^~ ~^~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.