c++ stl 源码解析笔记(一) stl_config 中的模板静态成员定义

1 篇文章 0 订阅

  • 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;
    }
     

    1. 第一种形式称之为特化定义,其作用是为模板某一特化提供其静态成员的定义,在我们例子中,它仅仅为Test<int>类的静态成员info提供定义。并且调用单参数构造函数初始化。
    2. 第 二种形式类似于普通类的静态成员的定义方式,其作用是隐式地在该编译单元为模板的所有特化提供其静态成员的定义,在我们例子中,在首次使用 Test<int>,Test<float>,Test<char>...会隐式提供静态成员的定义,并且调用单参 数构造函数初始化。
    3. 第三种形式和第二种形式一致,唯一不同就是采用默认构造函数初始化。

    其次,说明一下错误的答案。

    1. 第一种形式,很多人都会认为是对的,认为它采用默认构造函数初始化。但编译器会对特化定义进行特殊处理,编译认为它是一个声明而非定义。至于为什么如此,应该询问一下制定标准的人。我认为可能实现这样的语法可能比较困难并且这个语法也比较鸡肋。

     参考文档:《STL 源码剖析》 侯捷.华中科技大学出版社 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值