对可变模板的调用是模糊的
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");
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);
// ~^~ ~^~
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 类X有多个默认构造函数和对重载函数的模糊调用
- 对C++基类的模糊函数调用
- C++中的构造函数调用模糊性
- Visual Studio不允许我使用sqrt或floor,对重载函数的模糊调用
- 修复C++多继承模糊调用
- 在Windows上为Matlab构建libspline - 对重载函数'pow'的模糊调用
- Clang模糊调用(int、float、double)
- 对可变模板的调用是模糊的
- 自定义成员检测器中的模糊调用
- Visual Studio 2012中嵌套boost::assign:list_of失效-对重载函数的模糊调用
- 编译boost时的模糊调用.type_erasure与VS 2015社区
- 可变的模糊调用
- 模板函数调用模糊性错误