1.9.1 stl_config.h 中的各种组态的第一个实例
此实例针对linux下gcc测试
#include <iostream> using namespace std; template <typename T> class testClass{ public: //纯粹为了方便测试,使用public static int _data; }; //为static data members 进行定义(配置内存),并设初值 int testClass<int>::_data = 1; //error __STL_STATIC_TEMPLATE_MEMBER_BUG int testClass<char>::_data = 2; //error 这两句是vc编译器支持写法 template<> int testClass<int>::_data = 1; //ok 特化 template<> int testClass<char>::_data = 2; //ok 特化 //or template<typename T> int testClass<T>::_data = 1; //定义并初始化 //or template<typename T> int testClass<T>::_data; //定义 /* template<> int testClass<int>::_data; //error */ int main() { cout << testClass<int>::_data<<endl; cout << testClass<char>::_data<<endl; testClass<int> obji1, obji2; testClass<char> objc1, objc2; cout << obji1._data <<endl; cout << obji2._data<<endl; cout << objc1._data<<endl; cout << objc2._data<<endl; obji1._data = 3; obji2._data = 4; cout << obji1._data <<endl; cout << obji2._data<<endl; cout << objc1._data<<endl; cout << objc2._data<<endl; return 0; }
- 第一种形式称之为特化定义,其作用是为模板某一特化提供其静态成员的定义,在我们例子中,它仅仅为Test<int>类的静态成员info提供定义。并且调用单参数构造函数初始化。
- 第 二种形式类似于普通类的静态成员的定义方式,其作用是隐式地在该编译单元为模板的所有特化提供其静态成员的定义,在我们例子中,在首次使用 Test<int>,Test<float>,Test<char>...会隐式提供静态成员的定义,并且调用单参 数构造函数初始化。
- 第三种形式和第二种形式一致,唯一不同就是采用默认构造函数初始化。
其次,说明一下错误的答案。
- 第一种形式,很多人都会认为是对的,认为它采用默认构造函数初始化。但编译器会对特化定义进行特殊处理,编译认为它是一个声明而非定义。至于为什么如此,应该询问一下制定标准的人。我认为可能实现这样的语法可能比较困难并且这个语法也比较鸡肋。
参考文档:《STL 源码剖析》 侯捷.华中科技大学出版社