Keyword Typename
1 template<typename T> 2 class SomeClass 3 { 4 typename T::subtype * ptr; 5 };
如果没有typename,T::subtype会被认为是一个静态成员。
A practical example:
1 // print elements in a STL container 2 template<typename T> 3 void print(T const & con) 4 { 5 typename T::const_iterator pos; 6 typename T::const_iterator end(con.end()); 7 8 for(pos=con.begin(); pos!=end; pos++) 9 .... 10 }
如果身处于模板之中,想要调用另外一个模板函数,可能需要用到.template
1 template<int N> 2 void printBitset(std::bitset<N> const & bs) 3 { 4 std::cout<<bs.template to_string<char, char_traits<char>, allocator<char> >(); // here we are inside a template and calling a template function 5 }
在5.2节,书上的说法和我的运行结果出现了分歧,我的运行环境是vs2013。
1 #include<iostream> 2 3 using namespace std; 4 5 void foo() 6 { 7 cout << "global foo" << endl; 8 } 9 10 template<typename T> 11 class Base{ 12 public: 13 void foo() 14 { 15 cout << "foo in Base" << endl; 16 } 17 }; 18 19 template<typename T> 20 class Derived1 :Base < T > 21 { 22 public: 23 void goo() 24 { 25 foo(); // foo in Base 26 Base<T>::foo(); // foo in Base 27 ::foo(); // global foo 28 } 29 }; 30 31 int main() 32 { 33 Derived1<int> d1; 34 d1.goo(); 35 return 0; 36 }
书上的说法是goo中第一个foo调用实际调用的并不是Base中的foo,然而我的运行结果把书上写的否定了。所以说这个事情可能是和编译环境有关系。为了避免不确定性,还是加上Base<T>::前缀,或者使用this指针比较保险,能够避免不确定性。
changlog:
2015/6/18 要滚去看数理方程了,先写这么多。
时间: 2024-10-29 03:11:17