g++ 3.4.3

近来公司的事情比较多,都没有时间来blog写写东西了。

近来公司其中一个项目需要程序在g++ 3.4.3下编译,而源代码在g++ 3.2.3下面一个Warning都没有,但是在3.4.3下则一堆Error了。后来发现原来g++ 3.4.3严格了很多。其中“出问题”最多的是这种情况:

class TObjBase
{
public:
    TObjBase(void) : m_nVal(0) {}
    ~TObjBase(void) {}

    int getVal(void) const { return m_nVal; }
    void setVal(int n) { m_nVal = n; }
protected:
    int    m_nVal;
};

template<class typeObj>
class TExtObj : public typeObj
{
public:
    TExtObj(void) : typeObj() {}

    int getExtVal(void) const { return getVal() + 100; }
};

这是一种比较常见的应用,Adapter和Decorator模式都会用到这种技术。但问题在于g++ 3.4.3却说int getExtVal(void) const { return getVal() + 100; }这一行错误,getVal()找不到。

的确,单以TExtObj这个类看来,怎么也是找不到getVal()的定义在哪里。g++ 3.2.3以及VC6、VC7等,均以十分相信开发者的态度猜测这个函数必定在其他地方定义了,有可能是外部独立的函数、有可能是typeObj的成员函数。但g++ 3.4.3却非要程序员很负责任的告诉编译器,究竟是哪一个getVal(),于是解决方法:
方法一:
int getExtVal(void) const { return typeObj::getVal() + 100; }

或者


方法二:
int getExtVal(void) const { return this->getVal() + 100; }

当然,如果是外部的独立函数,那就是:

int getExtVal(void) const { return ::getVal() + 100; }

然而,在getVal()是虚函数的时候,方法一和方法二是有区别的,这个是需要十分小心的事情。方法一是无论什么时候都会调用typeObj的getVal(),方法二是调用当前类最适合的虚函数getVal()。

阅读更多
个人分类: C/C++
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页

关闭
关闭
关闭