Chinaunix

标题: 模板类static成员变量怎么初始化 [打印本页]

作者: cxytz01    时间: 2013-09-29 15:26
标题: 模板类static成员变量怎么初始化
本帖最后由 cxytz01 于 2013-09-29 15:38 编辑
  1. #include <iostream>


  2. //template <class T>
  3. class A {
  4. public:
  5.     static int i;   //明确知道变量i是static int类型,下面使用int A::i = 3;进行初始化
  6.     //如果打开上面的template注释,且上句是static T i;  那么怎么初始化。

  7. };

  8. int A::i = 3;


  9. int main()
  10. {



  11.     return 0;
  12. }
复制代码
<<C++ primer>>第四版12.6.2说:
不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。所以请问,模板类的static成员变量怎么初始化,不知道其类型怎么初始化?

另外,static数据成员不是类对象的组成部分,独立于对象存在,而模板类只有在实例化成对象的时候,才可以知道template的类型。所以模板类的static成员变量是不是不能为泛型类型?
作者: kdkgod    时间: 2013-09-29 15:32
我的习惯是写模板类时把声明和定义全写到模板类里面,如果将模板类的声明和定义分到头文件和cpp文件的话,在windows里可以编译通过,但是在linux一定编不过去。具体为什么我也不是很清楚。
作者: cxytz01    时间: 2013-09-29 15:39
回复 2# kdkgod


答非所问。

问题的意思是不知道static成员变量的类型怎么初始化static成员变量。

   
作者: littledick    时间: 2013-09-29 15:52
本帖最后由 littledick 于 2013-09-29 15:52 编辑

你可以直接用T的默认构造函数、带参数的构造函数初始化之。
作者: w_anthony    时间: 2013-09-29 15:56
template <class T> int A<T>::i = 3;
作者: myworkstation    时间: 2013-09-29 15:58
回复 3# cxytz01


    template<class T> int  A <T>::i= 0;
作者: cxytz01    时间: 2013-09-29 15:58
回复 5# w_anthony

可行吗,如果是string呢。
作者: cxytz01    时间: 2013-09-29 15:59
本帖最后由 cxytz01 于 2013-09-29 16:00 编辑

回复 6# myworkstation


如果我实例化后给T传入的是string,或者其他类型对象呢。

   
作者: cxytz01    时间: 2013-09-29 16:01
是不是模板类泛型static成员变量本身就是一个矛盾的东西,不建议使用的?
作者: w_anthony    时间: 2013-09-29 16:01
回复 7# cxytz01


    如果说之前不知道语法没法测试,但是现在难道不能试试了吗?
作者: myworkstation    时间: 2013-09-29 16:02
回复 8# cxytz01


    template<class T> std::string  A <T>::i= "hello";
作者: w_anthony    时间: 2013-09-29 16:05
回复 11# myworkstation


    貌似他不是说int换成string,而是说A<std::string>::i这个样子,说实话我不知道LZ为什么觉得这里有矛盾,对于不同类型的T是会生成不同的静态成员变量,你大可以%p打印其地址测试
作者: cxytz01    时间: 2013-09-29 16:13
本帖最后由 cxytz01 于 2013-09-29 16:15 编辑

回复 10# w_anthony

回复 11# @myworkstation

看来大家都误会了,我在写写。

template<class T>
class A {
public:
    static T i;   //i是T类型
};


template<class T> T A<T>::i = 这里填什么?  char?string?int?float?vector?map?pair?还是其他自定义对象。


   
作者: w_anthony    时间: 2013-09-29 16:18
本帖最后由 w_anthony 于 2013-09-29 16:27 编辑

回复 13# cxytz01


    那就是什么都不要写了template <class T> T A<T>::i;
刚才漏一个A前面的T,补上
作者: myworkstation    时间: 2013-09-29 16:19
回复 13# cxytz01


    只要是T类型接受的初始化方式都可以写。具体写什么由T是什么来决定。
作者: chf2013yzb    时间: 2013-09-30 13:46
948039985QQ群,这是一个讨论Linux技术和服务器技术平台,希望大家加入这个群一起讨论和学习,群主旨在提供一个Linux技术平台,为加入此群的人提供技术交流,同时希望高手,老手们加入,以帮助辅导那些刚入门的新手们,俗话说“助人乃快乐之本”,同时我们还欢迎成员讨论当前IT新技术话题,同样可以讨论技术管理和管理话题。此群是一个多元化的平台,学习技术的同时还可以了解管理方面的知识,促进群成员的全面发展,而不只是停留在技术层面。欢迎你们的加入!!!
作者: mfkp3    时间: 2013-10-07 16:54
http://stackoverflow.com/questio ... in-the-header-file.
这里有个帖子说明为什么模板类实现要和头文件放在一起。
回复 2# kdkgod

对于楼主的要求,在模板文件中给出static定义: template <class T> T A<T>::i;  然后在使用的时候,直接赋值即可,如A<int>::i = 5;







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2