标签:
1. 受限名称:前面有::运算符成员访问运算符。比如 this->var
2. 依赖型名称:以某种方式依赖于模板参数。比如 std::vector<T>::iterator
更详细的分类见P116。
1 int x; 2 3 class B 4 { 5 public: 6 int i; 7 }; 8 9 class D: public B 10 { 11 }; 12 13 void f(D* pd) 14 { 15 pd->i=3; //ok 16 D::x=2; // wrong, obviously 17 } 18 19 ================================================== 20 21 extern int count; // 1 22 23 int lookup(int count) // 2 24 { 25 if(count<0) 26 { 27 int count =1; // 3 28 lookup(count); // 3 29 } 30 return count+::count; // 1+2 31 } 32 33 ================================================== 34 35 // a tricky one 36 template<typename T> 37 inline T const & max(const T & a, const T & b) 38 { 39 return a<b?b:a; 40 } 41 42 namespace BigMath 43 { 44 class BigNumber 45 { 46 bool operator<(const BigNumber &, const BigNumber &); 47 }; 48 } 49 50 using BigMath::BigNumber; 51 52 void g(const BigNumber & a, const BigNumber & b) 53 { 54 BigNumber x = max(a, b); // max needs to know namespace BigMath 55 }
(看起来C++在名称的查找这里是有坑的,不过我暂且跳过)
上下文相关性:C++是上下文相关的语言
1 X<1>(0) == (X<1) > 0?
另一个坑
1 class X 2 { 3 ... 4 }; 5 6 List<::X> many_X; // Noooooo! <: is a digraph which is [ 7 List< ::X> some_X; // Good
changelog:
2015/6/28 看到模板解析。
标签:
原文地址:http://www.cnblogs.com/ch3cooh/p/cpp_template_ch9.html