• 全部
  • 问答

模板,继承,基类指针和派生类指针。。。

pacman2000 2004-07-23 03:34:43
起因于一个程序从g++ 2.95移植到g++ 3.4,报的错误。

程序1:
template < typename T > class A
{
protected:
T i;
};
template < typename T > class B: public A<T>
{
public:
T f() { return i; }
};
int main()
{
B<int> b;
b.f();
}
结果:g++ 3.4报错! error: `i' undeclared。
解决方法:把i改为B<T>::i或者A<T>::i就可以了。

程序2:
class A {};
template < typename T > class B: public T {};
template < typename T > class C
{
protected:
B<T> b;
};
template < typename T > class D : public C<T>
{
public:
void f() { T* p=&(D<T>::b); }
};
int main()
{
D<A> d;
d.f();
}
结果:编译报错。error: cannot convert `B<A> C<A>::*' to `A*' in initialization
如果D<A>的话,那么b是B<A>类型的,是A的继承类,但是我却不能把 A* p=&b;
如果不做到基类指针A* p的转换,直接用D<T>::b是可以的。
解决办法: T* p=&(this->b);

究竟为什么呢? 废人兄给出了理论解答:“B<A>::b 是一个 B<A>::* ,指向成员的指针,大小据说比一般的指针大。就像 void A::fp (void); 和 void (*fp) (void); 的区别 ”,所以编译器才说`B<A> C<A>::*',包含了比普通指针更多的内容。

另外,星星在VC2003中测试了上面的程序,结果和g++ 2.95一样可以通过。

呵呵,今天又上了一课,废人和星星来领分吧。
...全文
206 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Wolf0403 2004-10-01
up,嘿嘿……
回复
积木 2004-09-24
不过C++ templates 上教导我们,当你分不清的时候,请使用this~
回复
goodluckyxl 2004-09-24
说的是黑猩猩哦
回复
北极猩猩 2004-09-24
楼主说的是那个星星呢?好像不是我吧。不记得什么时候回答过这个问题。
回复
cqhejun 2004-09-24
散分的呀
回复
pacman2000 2004-07-23
感觉g++3.4在这方面是不是太紧了,毕竟这是符合C++标准语法的啊。

成员变量和成员函数不一样,成员函数是因为里面有this指针。
例子:
class A {};
class E: public A {};
class F
{
public:
E e;
};
class G:public F
{
public:
void f() { A* p=&e; } // 或者A* p=&(G::e);也对
};
int main()
{
G g;
g.f();
}
这里就是可以的,看来跟模板有关。
回复
freefalcon 2004-07-23
ft,好不容易看完了,居然是放分的,浪费感情啊,以后题目写清楚点,:)
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2004-07-23 03:34
社区公告
暂无公告