c++ - 为什么我们需要类型名称依赖于 C++ 中的模板参数

标签 c++ templates generics typename

<分区>

我在 Wiki 上查找关键字 typename ( http://en.wikipedia.org/wiki/Typename ),它给出了一个示例,在 T::bar 之前需要 typename

template <typename T>
void foo(const T& t)
{
   // declares a pointer to an object of type T::bar
   T::bar * p;
}

struct StructWithBarAsType {
   typedef int bar;
};

int main() {
   StructWithBarAsType x;
   foo(x);
}

为什么 C++ 在为 foo(x) 生成代码时不检查 StructWithBarAsType 并发现 T::bar 实际上是一个类型?是不可以还是只是效率的考虑?

最佳答案

它假设T::bar是静态成员,除非 typename预先指定。 afaict 没有技术限制会阻止编译器在实例化过程中弄清楚 T::bar 是否存在。是一种类型,但为了让编译器实现者更容易一些,做出了这个决定。它可以产生比人们想象的更多的差异,考虑一下

T::bar<a,b>c;

这是一个变量吗 c类型 T::bar<a,b> ,还是小于,逗号,大于? T::bar < a其次是 b > c ? C++ 模板语法还有很多不足之处。

关于c++ - 为什么我们需要类型名称依赖于 C++ 中的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27497331/

相关文章:

c++ - 何时使用哪种排序算法,何时绝对不应该

c++ - 在 C++ 中循环遍历 .txt 文件的行

C++ 模板和别名

swift - swift 中的通用整数转换

c++ - 在 C++11 中的编译时 (constexpr) 计算斐波那契数(递归方法)

c++ - NMAKE : fatal error U1077: cl. exe 和 nmake.exe 返回代码 '0x2'

java - 未绑定(bind)通配符和原始类型之间的区别

c# - 如何使用 LINQ 对通用列表中的值求和?

c++ - 你觉得什么是过度概括?

c++ - 匹配别名模板作为模板参数