古怪的 C++ 问题

我好多年没写 C++ 程序了,读 C++ 代码也是偶尔为之。

今天晚上就碰到这么一个诡异的问题,我觉得是我太久没摸 C++ 了,对那些奇怪的语法细则已经不那么熟悉了。有知道的同学给我解惑一下吧。

事情的起因是,我想安装一个 perl 模块唤作 Syntax::Highlight::Universal 。

本来用 CPAN 安装很方便的,直接 install 即可。

可是在我的机器上,make 死活通不过。我就仔细研究了一下编译出错信息。又读了一下源代码,自己感觉没错。纠结了半天,仔细模仿出错的地方写了一小段程序测试。

template class A { protected: int a; }; template class B : public A { public: void foo() { a=0; } };

各位同学觉得有问题么?我初看觉得没有。但是 gcc 一编译就出错。一开始是觉得 gcc 版本太高(4.x),可能语法检查更严格了。后来换了 gcc3 ,问题依旧。

出错信息如下:

a.cpp: In member function `void B::foo()':

a.cpp:11: error: `a' was not declared in this scope

就是在 B 里找不到 A 定义的成员变量 a 。

如果 A 不是一个 template ,那么这个问题就没有。

我琢磨着这个问题跟编译器为 template 生成代码的行为有关,但是不确定。

注:这段代码在 VC6 里是可以正常编译的。

最后,我试了一下,把代码改成

    void foo() { 
        this->a=0;
    }

那么是可以编译通过的了。可是,这是新标准规定的么?

btw, 其实我写 C++ 的最后一年,都养成了显式用 this 指针的习惯。这样比较少犯错误。