Chinaunix
标题:
模板类static成员变量怎么初始化
[打印本页]
作者:
cxytz01
时间:
2013-09-29 15:26
标题:
模板类static成员变量怎么初始化
本帖最后由 cxytz01 于 2013-09-29 15:38 编辑
#include <iostream>
//template <class T>
class A {
public:
static int i; //明确知道变量i是static int类型,下面使用int A::i = 3;进行初始化
//如果打开上面的template注释,且上句是static T i; 那么怎么初始化。
};
int A::i = 3;
int main()
{
return 0;
}
复制代码
<<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