常静态成员变量,即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)
{
}