码迷,mamicode.com
首页 > 编程语言 > 详细

C++模板编程 - 第五章 技巧性基础知识

时间:2015-06-18 23:47:36      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

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 要滚去看数理方程了,先写这么多。

C++模板编程 - 第五章 技巧性基础知识

标签:

原文地址:http://www.cnblogs.com/ch3cooh/p/cpp_template_ch5.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!