类模板中的 Typedef 计算
Typedef evaluation in a class template
以下代码使用 g++ 编译,但无法使用 clang 编译。
struct X;
template <typename T>
struct Traits
{
typedef typename Traits<T>::Container Container;
};
template <>
struct Traits<X>
{
typedef std::vector<X *> Container;
};
int main()
{
Traits<X>::Container container;
return EXIT_SUCCESS;
}
叮当错误消息:
main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'
编译器是否应该在不用实际类型替换模板参数的情况下计算 typedef?哪个编译器是正确的?
叮叮当当:http://coliru.stacked-crooked.com/a/fef7725827074e4f
海湾合作委员会:http://coliru.stacked-crooked.com/a/79e17031fcabcd83
template <typename T>
struct Traits {
typedef typename Traits<T>::Container Container;
};
这是格式不正确的,不需要诊断。 没有任何T
使上述(主要(专用化可以生成有效的代码。
另一个专业化的存在没有区别。 编译器可以自由地做任何事情,包括给出虚假的错误消息。 编译它是自由的。 只有当您在程序的其他地方有一个名为foo
的变量时,或者如果月球是新的,才能免费生成错误。 有些如果这些是执行质量差。
在实践中,这意味着编译器可以自由地假设主要专用化对某种类型T
有效(即,其中没有无限递归(,并在相对不相关的代码中胡说八道,因为它做出了这个假设。
相关文章:
- C++:TypeDef使用元组
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 计算缩放多边形的比例,得到给定的多边形面积
- 类模板中的 Typedef 计算