g++里使用常静态成员变量的一个BUG
2014-06-07 10:00
204 查看
常静态成员变量,即static Type const vName这样的成员变量。以下代码,在g++中编译时链接失败,但是在VS2005和VS2008中编译是没有问题的。
链接失败原因:
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 = 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) { }
相关文章推荐
- 在使用.Net Reflector时发现了一个Bug:)
- vs2008beta2中Linq2Sql的一个bug:无法使用XmlMappingSource
- Android使用EditText遇到的一个bug
- AIX上使用gcc和g++的一个编译问题的解决
- posix多线程程序使用条件变量的一个常见bug
- 写给公司的一个Bug需求管理系统,公司一直使用良好
- 在虚拟机的XP中使用管道出现的问题,可能是一个BUG,先记录下来
- 一个linux下g++使用的 makefile 模板
- 今天发现Eclipse cdt 使用scanf后的一个BUG
- 通达OA--关于工作流强制使用电子签章中的一个BUG
- 发现使用phpAdmin更新数据的一个bug!
- 在Flash Builder中使用SWFAdress时的一个Bug
- Linux 2.4.18的内核在使用S3C2410板的USB设备时碰到的一个Bug的解决办法
- 使用Qstring时候碰到的一个bug
- Flex AIR: 使用透明 NativeWindow 窗体呈现 Line Chart 的一个 bug (Exception in CartesianChart/updateMultipleAxesStyles)
- 在使用.Net Reflector时发现了一个Bug:)
- 从AX4.0本地化SP2凭证系统的一个bug看UserConnection的使用
- 一个linux下g++使用的 makefile 模板
- android上使用cocos2dx的一个bug
- 通达OA--关于工作流强制使用电子签章中的一个BUG