C++中,模板类的常量静态成员函数的初始化问题

代码如下
template<class T>
class A{
private:
static const T x;
。。。
。。
};

template<class T>
int A<T>::x=0;

template<class T>
float A<T>::x=1.0f;

有两个问题:
以上代码报错,说我重定义了常量静态成员变量,可是问题不同的模板实例需要不同的变量值,这种情况下应该如何实现?
关于初始化的位置问题,是应该放在头文件中还是应该放在实现文件中?

你想声明什么类型的变量?
1.int型
声明一个静态常量,因为const常量只能在声明时初始化,所以你直接在类的private部分改为:
static const int x = 0;
然后把后面
template <class T>
int A<T>::x = 0;
去掉就可以了。
2.T型
声明一个静态常量,因为const常量只能在声明时初始化,所以你直接在类的private部分改为:
static const T x = 0;
然后把后面
template <class T>
int A<T>::x = 0;
去掉就可以了。不过会面临一个问题,不知道T具体的类型,用0去初始化它可能会不合适。

template <class T>
T追问

还有,你好像没有明白我的意思。讲具体一点,我想写一个叫做color的模板类,里面有两个标志了颜色取值的上下界的静态常量;有可能通过两种类型实例化它,一个是unsigned char类型0~255, 还有float 类型0.0f~1.0f。因此上下界必须针对不同的类型设定不同的值,这个问题如何解决?

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-01
你原来设计的是一个静态变量,不可以再给他赋值啊,你要赋值应该在类中赋值。
那个初始化,应该是在main函数中要用到该模板时直接用一个现实的类型代替T就可以了。
额,那个,还有啊,说一句,要用类中的私有元素只能通过类中的函数,或是构造函数实现,你在类外怎么能直接用啊。
第2个回答  2013-05-31
template<>
int A<int>::x=0;

template<>
float A<float>::x=1.0f;本回答被提问者采纳
第3个回答  2013-05-31
static const T x;

改成
static const int x;或者static const float x;

c++模板类中的静态成员变量什么时候会被初始化,如果想要指定其在某个...
如果想要在某个源文件中初始化 首先要引用这个模板类,然后为这个模板类中的静态成员变量赋值。template<class T> class Test{ private:T n;const T i;static T cnt;};template<class T> int Test<T>::cnt = 0;\/\/初始化

c++中可以对类中私有成员中的静态变量初始化吗?
1.static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。2.静态成员不能在类定义里边初始化,只能在class body外初始化。3.静态成员仍然遵循public,private,protected访问准则。4.静态成员函数没有this指针,它不能返回非静态成员,因为除...

c++类里面添加类的静态成员指针变量如何初始化
Person* Person :: q = new Person; \/\/这个就是类外面初始化。或者 Person* Person :: q=NULL;参看如下代码:include<iostream>using namespace std;class Person{public:Person(){cout << "默认构造函数" << endl;}public:static int m_A; \/\/静态 int型变量声明static int* q; ...

C++中类成员初始化方式
在C++98中,就地声明允许在类声明中使用等号加初始值初始化静态成员常量。然而,就地声明的要求较高,静态成员必须是常量,且只能是整型或枚举型。而非静态成员变量必须在构造函数中初始化。初始化顺序为:先就地声明,然后初始化列表,最后构造函数初始化。列表初始化值会覆盖声明时的值,构造函数的值又会...

C++静态结构体数据成员的初始化
静态成员初始化,只能在类外以全局的方式进行,不能在类中完成.include<iostream> using namespace std;struct consumer { int num;char name[18];char password[26];long yu_e;};class ATM { public:void in();void out();void changeP();void check();void give();private:static consumer ...

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值
如果该对象是全局的话,其成员中的内置类型就会自动初始化对应的默认值(像整形就为0)和调用构造函数初始化,如果是局部的话只会调用默认构造函数赋值,构造函数中没有涉及到的成员,并不会赋值。

C++中, 类的私有数据成员在定义的时候不能进行初始化吗?
是的,C++中类的数据成员不管是不是私有的,都不能进行初始化。因为类就相当于一个数据的模板,是一种自定义组合的新数据类型,而不是一个变量。当程序声明一个类的时候,事实上并没有为程序申请存储空间,只有用这个类定义一个类对象的时候,才申请空间。连空间都没有,当然不能像定义变量一样的...

C++全局变量初始化
全局变量、文件域的静态变量和类的静态成员变量在main执行前进行静态初始化,分配内存并初始化。局部静态变量在第一次使用时分配内存并初始化。这里的变量涵盖了内置数据类型和自定义类型的对象。在函数内部,静态对象的初始化会在第一次运行到函数的那部分代码时发生。假设有一个函数testFun,函数内部的...

c++11之前,只有静态常量整型数据成员才可以在类中初始化是为什么
只有静态常量整型数据成员,才可以在类中初始化。这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。当用类 定义对象(变量,常量)时候,才开始定义数据。静态常量整型数据成员 1)不是对象的一部分 2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就...

C++类中静态变量和静态方法使用介绍
1、静态数据成员在定义或说明时前面加关键字static。\/\/静态变量的定义 2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:<数据类型><类名>::<静态数据成员名>=<值> \/\/静态变量的初始化 这表明:下面举一例子,说明静态数据成员的应用:注意,static成员的初始化要在实现...

相似回答