对可变模板的调用是模糊的

Call to variadic template is ambigous

本文关键字:调用 模糊      更新时间:2023-10-16

我有一个可变模板函数,它可以工作,除非我用与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"); 

Ambigus呼叫:

std::string str = "fubar";
auto sharedStr = make_shared<std::string>(str);  

我想知道第二个电话怎么了。

现场演示

对于使用非限定名称的函数调用,名称查找过程还会考虑在其中声明参数类型(及其类型模板参数)的命名空间,也称为参数依赖查找。对于std::string类型的参数,这意味着还将在std命名空间中搜索make_shared函数。因此,可行过载的集合还包括std::make_shared函数,因此具有模糊性。

一个解决方案是更改函数名以避免与std的重载冲突,或者用括号括起函数名:

auto sharedStr = (make_shared<std::string>)(str);
//              ~^~                      ~^~