为什么我不能使用 std::unique_ptr 作为"模板<class>类"参数?
Why can't I use std::unique_ptr as a "template<class> class" argument?
此代码:
#include <memory>
template <template <typename> class Ptr>
class A { Ptr<int> ints; };
using B = A<std::unique_ptr>;
产生以下错误(GCC 6.3(:
a.cpp:6:28: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class> class Ptr> class A’
using B = A<std::unique_ptr>;
^
a.cpp:6:28: note: expected a template of type ‘template<class> class Ptr’, got ‘template<class _Tp, class _Dp> class std::unique_ptr’
现在,我可以解决这个问题,比如:
template <typename T>
using plugged_unique_ptr = std::unique_ptr<T>;
using B = A<plugged_unique_ptr>;
但为什么我必须这样做?我的意思是,为什么编译器不愿意用默认值"插入"std::unique_ptr
的第二个模板参数,并允许std::unique_ptr
用作A
的模板参数?
因为模板模板参数需要精确匹配。这意味着默认模板参数在这里不相关。请注意,将模板-模板参数扩展到两个模板参数只会在偶然的情况下起作用:一个实现可以添加比标准定义的更多的模板参数,有些实现在围绕std容器的SFINAE的情况下经常这样做。
这也是我通常建议不要使用任何模板-模板参数的主要原因,而应该使用简单的模板typename。如果您需要访问嵌套的模板类型,请在第行提供内部访问器,例如value_type
或外部访问器,如tuple_element
,以便在模板内访问这些类型。
注意:这在C++17中显然发生了变化,那里的匹配不再精确,但稍微放松但更复杂。尽管如此,我还是建议一般不要使用模板-模板参数。
std::unique_ptr
有第二个带有默认值的模板参数,因此template <typename> class Ptr
与std::unique_ptr
不匹配
template <typename...> class Ptr
将工作
cppreference
正如@HolyBlackCat所建议的,我们不再需要对C++17使用任何变通方法,OP的代码确实可以编译(coliru.com(。
GCC 6.3.0默认编译C++14代码,不应用此语言语义更改。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 关于使用运算符<<为新手提供C++中的模板
- 运算符<<(ostream&os,..)用于模板类
- & lt; & lt;使用继承和模板定义
- operator< & lt;重载、名称空间和模板