簡體   English   中英

調用可變參數模板是不明智的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM