最近由于考虑到项目的安全性能问题。打算把在RH8 GCC3.2环境的项目移植到CentOS4.4 GCC3.4环境上,在编译的过程当中发现了很多问题。原来在GCC3.2可以顺利通过编译的语法在GCC3.4上会报错误和警告,下面是遇到的问题,以及如何解决方案,拿出来与大家分析一下。
1. 模板的继承
a) Code:
template < class Msg >
class Base{
……………………
Threads::Mutex myMutex;
…………………….
}
template <class Msg> class Fifo : public Base<Msg>
{
public:
…………………..
int error = myCondition.wait(&myMutex, relativeTimeout);
………………………
}
GCC 3.2编译通过,GCC3.4有errro
error: `myMutex' was not declared in this scope
对这点,我有点晕,为什么会报错呢?找了很多C++参考书籍也没有这方面特别的说明,我认为关节点在Base<Msg1> 和Base<Msg2>是不是一个类型,按照<<The C++ Programming Language 3rd>>.这两个之间没有关系。这只是我个人的看法。解决的办法是在sub class template里面申明一下父类的成员。
Using Base<Msg>::myMutex;
或者在myMutex之前加一个this指针。
This->myMutex.
b) Code:
struct hash< Def>
{
//
};
GCC3.4报错:
error: an explicit specialization must be preceded by 'template <>'
看来GCC的高版本对语法的检测很严格,对于模板的特例化,要在前面加template<>
2. 语法:
a) #define DEF(x)
Struct {
X* a;
Int lenth;
}
Typedef DEF(void) VOID_TYPE
………………………………………
Struct functionArray{
Int (void * fun)(void *p,int parscoutn);
VOID_TYPE (void* fun2)(void* p,int pars);
……………………………………………
}
error:`VOID_TYPE' declared as function returning a function
这的地方我始终没有搞明白为什么抱错,我通过测试传值给它判断它的类型,结果发现编译器把VOID_TYPE (void* fun2)(void*p,int pars)当作void VOID_TYPE(void*)(…..) 处理了,本来VOID_TYPE是fun2指针的返回类型。结果给当作成了函数了。可是这个代码是GCC 3.2是通过的。
修改的办法如下:
Struct {
Void * a;
Int lenth;
} VOID_TYPE;
…………………
Struct functionArray{
Int (void * fun)(void *p,int parscoutn);
Struct VOID_TYPE (void* fun2)(void* p,int pars);
……………………………………………
}
编译通过。