1. 嵌套依赖

#include <iostream>
using namespace std;
class A{
public:
class B{
public:
void foo(){
cout << "zhe e xin" << endl;
}
};
};
template<class T> void Func(){
typename A::B b;
b.foo();
}
int main(void){
Func<int>();
return 0;
}
2. 依赖模板参数访问成员函数模板

- 第一次编译时,发现用未知类型定义的对象访问成员函数模板,属于未知类型调用,而对于未知类型调用编译器是不允许<>存在的。
- 而访问成员函数模板必须要加<>, 解决办法就是加template
#include <iostream>
using namespace std;
class A{
public:
template<class T> void foo(){
cout << "A::foo<T>" << endl;
}
};
template<class D> void Func(){
D d;
d.template foo<int>();
}
int main(void){
Func<A>();
return 0;
}
3. 子模板访问基模板

- 类模板不是类, 没有类的语义,所有父子类模板没有继承一说, 继承是子类与基类之间的事.
- 所以图中第一句话就是一个伪命题,子类模板根本就不可能访问基类模板成员。
#include <iostream>
using namespace std;
template <class T>class Base{
public:
int m_i;
void foo(){
cout << "Base<T>::foo()" << endl;
}
};
template <class T, class D> class Derived: public Base<T>{
public:
void bar(){
Base<T>::m_i = 100;
Base<T>::foo();
}
};
int main(void){
Derived<int ,int> d;
d.bar();
return 0;
}
4. 零值初始化

#include <iostream>
using namespace std;
class Integer{
public:
Integer():m_i(0){}
friend ostream& operator<<(ostream& os, const Integer& c){
os << c.m_i;
}
private:
int m_i;
};
template<class T>void Func(){
T t = T();
cout << t << endl;
}
int main(void){
Func<int>();
Func<Integer>();
return 0;
}
$ ./a.out
0
0
5. 类模板中的成员虚函数

#include <iostream>
using namespace std;
template <class T>class Base{
public:
int m_i;
virtual void foo(){
cout << "Base<T>::foo()" << endl;
}
};
template <class T, class D> class Derived: public Base<T>{
public:
void foo(){
cout << "Derived<T, D>::foo()" << endl;
}
};
int main(void){
Derived<int ,int> d;
Base<int> * p_base = &d;
p_base->foo();
return 0;
}