类模板的别名
alias of class template
本文关键字:别名 更新时间:2023-10-16
考虑一个像下面代码中的A
这样的别名模板。现在设B
为A
的别名模板
在下面的代码中,这些类模板用作结构体C
的模板参数,该结构体仅为一个类型名(A
)特殊化。clang -std=c++11
与error: implicit instantiation of undefined template 'C<B>'
同时存在,表明需要B
的另一个专门化。
template<int N>
using A = int;
template<int N>
using B = A<N>;
template<template<int> class I>
struct C;
template<>
struct C<A> {};
int main() {
C<A> c;
C<B> d; // clang error: implicit instantiation
}
为什么(如果甚至)它是-尽管不允许特殊化的别名- A
和B
被视为不同的类模板?是否有一种解决方法允许我重命名一个冗长的模板而不会产生此问题?
这是CWG问题#1286,处理这个例子:
template<template<class> class TT> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; X<Y> y; X<Z> z;
质疑y
和z
是否具有相同的类型。
基本上,根据标准,clang拒绝代码是正确的。所有[temp.alias]告诉我们的是:
当模板id引用别名模板的专门化时,它等同于关联的类型通过将别名的类型id中的模板参数s替换为模板参数s获得模板。
因此,虽然A<X>
等同于B<X>
(对于所有X
!),但没有措辞表明A
等同于B
。但在某种程度上,这没有任何意义,因为B
和A
应该是等效的。有一项提议的决议将这样做,但尚未获得批准。
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 告诉c++编译器该参数没有别名
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 模板模板参数和模板别名:编译器错误?
- 使用定义函数模板别名
- 为模板参数包添加别名
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- C++使用默认模板参数键入别名和转发声明
- 在Qt中注册自定义元类型的别名类型
- 缺少别名模板C++参数列表
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名