对可变参数模板的调用不明确
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);
我想了解第二次调用有什么问题。
对于使用非限定名称的函数调用,名称查找过程还会考虑在其中声明参数类型(及其类型模板参数)的名称空间 - 也称为 Argument Dependent Lookup 。对于 std::string
类型的参数,这意味着还会在 std
命名空间中搜索 make_shared
函数。因此,可行的重载集还包括 std::make_shared
函数,因此存在歧义。
一个解决方案是更改函数名称以避免与 std
的重载冲突,或者用括号括起函数名称:
auto sharedStr = (make_shared<std::string>)(str);
// ~^~ ~^~
我有一个可以工作的可变参数模板函数,除非我使用与 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);
我想了解第二次调用有什么问题。
对于使用非限定名称的函数调用,名称查找过程还会考虑在其中声明参数类型(及其类型模板参数)的名称空间 - 也称为 Argument Dependent Lookup 。对于 std::string
类型的参数,这意味着还会在 std
命名空间中搜索 make_shared
函数。因此,可行的重载集还包括 std::make_shared
函数,因此存在歧义。
一个解决方案是更改函数名称以避免与 std
的重载冲突,或者用括号括起函数名称:
auto sharedStr = (make_shared<std::string>)(str);
// ~^~ ~^~