g++里使用常静态成员变量的一个BUG

    常静态成员变量,即static Type const vName这样的成员变量。以下代码,在g++中编译时链接失败,但是在VS2005和VS2008中编译是没有问题的。

#include<iostream>
#include<vector>
using namespace std;

class CTest
{
public:
	static int const t = 3;
	void TestStaticConst(void);
};

void CTest::TestStaticConst(void)
{
	vector<int> ivec;
	vector<int>::iterator it = ivec.begin() + t;	
}

int main(void)
{
}

链接失败原因:

 In function `CTest::TestStaticConst()':
btree.cpp:(.text+0x2e): undefined reference to `CTest::t'
collect2: 错误:ld 返回 1

但是如果把第15行,vector<int>::iterator it = ivec.begin() + t;,把最后的加法调换个顺序,即修改成vector<int>::iterator it = t+ ivec.begin();,就可以编译通过。

上述代码在VS2005和VS2008中编译均是通过的,在G++中t在前和在后的结果不一样,应该是个小BUG。

解决方法:

        个人没看到过其他人的程序中使用常静态成员变量的,这个应该很少使用。

         在类的声明里对常静态成员变量初始化,即static int const t = 3,这种写法是受限的。只能对整型(char/short/int/long)变量初始化,浮点型(float/double)或复合类型(如string)的常静态成员变量是不能在类声明里初始化的。所以在使用常静态成员变量时,标准做法是不要像上面那样在声明里初始化,而是像普通static成员变量一样,在类外初始化即可。

        标准写法见下,这样在g++里也可编译通过。

#include<iostream>
#include<vector>
using namespace std;

class CTest
{
public:
	static int const t;
	void TestStaticConst(void);
};

int const CTest::t = 3;

void CTest::TestStaticConst(void)
{
	vector<int> ivec;
	vector<int>::iterator it = ivec.begin() + t;	
}

int main(void)
{
}


猜你喜欢

转载自blog.csdn.net/missgya/article/details/29174149