posts - 5, comments - 40, trackbacks - 0, articles - 0

GCC不能正确继承模板类?

Posted on 2008-03-02 07:10 Wang Jinbo 阅读(3634) 评论(8)  编辑 收藏 引用 所属分类: C++
GCC编译器似乎不能理解继承自模板类里的数据成员。我还以为是代码的问题,郁闷了半天后,居然在Borland C++ 5.5下编译通过了。节省篇幅,我抽出主要部分。
template<class T>  
class A{  
    
protected:  
        T id;  
};  
template
<class T>  
class B: public A<T>{  
    
public:  
        
void setid(T i){  
            id
=i;  
        }  
        
void test1(){  
            cout
<<"B::test1() ID: "<<id<<endl;  
        }  
};
B类的id本应该是从A类里继承来的,但用GCC编译会提示说变量id未定义。试着用Borland的编译器就很痛快地过了。我使用的是MinGW的 GCC 3.4,但我在Unix-Center的机器上使用Unix和Linux版本的GCC 4.0编译仍然通不过,但Solaris上的Sun Studio的C++编译器则没问题。
难道就这么幸运地碰上GCC的Bug了?

Feedback

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-02 09:22 by Santa
你要是用到父类变量需要加 this->
或者在子类声明的时候标明 using A;

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-02 09:39 by 死循环ing...
template<class T>
class A{
protected:
T id;
};
template<class T>
class B: public A<T>{
public:
void setid(T i){
A<T>::id=i;
}
void test1(){
cout<<"B::test1() ID: "<<A<T>::id<<endl;
}
};
根据错误提示,说明未指定域,所以修改了一下,就通过了,原因不明(= =")
GCC4.2.1-sjlj

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-02 11:33 by 空明流转
这似乎是gcc编译器本身的问题。

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-02 12:06 by stO
G++做的是对的,你应该回去好好看看C++标准.
同时你可以用-fpermissive放宽要求

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-02 15:56 by 空明流转
@stO
大部分编译器的实现都是在初始化列表里满足此项要求,而构造函数体这一要求都放宽了,跟人觉得这一要求也确实没有什么道理,因为在调用子类构造函数的时候基类都已经构造完毕了。标准也只是标准而已。

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-03 13:48 by eXile
这个设计到模板的两次扫描机制,VC或BC的做法可以使编译略微快一些,但是会对一些还没有实例化的模板代码中的语法错误视而不见,而GCC的做法更为稳妥一些,也是符合标准的的行为。

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-03-05 10:49 by zhiyong
“对一些还没有实例化的模板代码中的语法错误视而不见”
是完全符合 C++ 标准的,而且这种特性还是有用的

# re: GCC不能正确继承模板类?  回复  更多评论   

2008-07-14 10:56 by ytj
经测试,用using a;A<T>::id;this->都可以解决问题,不过G++的这个特性让我很不爽。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理