C++模板类的继承
template<classc>classC{};template<classa,classb>classA:publicC<c<a,b>>{};这段代码中……C<c<a...
template<class c>
class C{};
template<class a,class b>
class A:public C<c<a,b>>
{};这段代码中……C<c<a,b>>……是什么意思?模板继承的语法究竟是怎样的啊!! 展开
class C{};
template<class a,class b>
class A:public C<c<a,b>>
{};这段代码中……C<c<a,b>>……是什么意思?模板继承的语法究竟是怎样的啊!! 展开
2个回答
展开全部
这么短的程序,不好分析啊
发个能编译通过的,稍微完整一点的吧
C< c<a,b>> 这个写法很奇怪,一个大写的 C,一个小写的c
很晕啊,需要太多的猜测了
还是发完整程序吧
应该很简单的问题,别搞复杂了
^_^
发个能编译通过的,稍微完整一点的吧
C< c<a,b>> 这个写法很奇怪,一个大写的 C,一个小写的c
很晕啊,需要太多的猜测了
还是发完整程序吧
应该很简单的问题,别搞复杂了
^_^
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
类模板可以继承也可以被继承。
1.在一个类模板中,一个非依赖型基类是指:无须知道模板实参就可以完全确定类型的
基类。
例如:
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
class D1:public Base<Base<void> >{//实际上不是模板
public:
void f(){basefield = 3; }
};
template<typename T>
class D2:public Base<double>{
public:
void f() { basefield = 7; }//正常访问继承成员
T strange;//T是Base<double>::T,而不是模板参数
};
注意事项:对于模板中的非依赖类型而言,如果在他的派生类中查找一个非受限名称,
那就会先查找这个非依赖型基类,然后才会查找模板参数列表。
2.非依赖性名称不会在依赖基类中查找
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
template <typename T>
class DD:Base<T>{
public:
void f(){
basefield = 0;//problem
}
};
template<>
class Base<bool>{
public:
enum { basefield = 42 };//tricky
};
void g(DD<bool>& d){
d.f();//opps
}
//修改方案一
template <typename T>
class DD1:Base<T>{
public:
void f(){
this->basefield=0;//查找被延迟了
}
};
//修改方案二
template <typename T>
class DD2:Base<T>{
public:
void f(){
Base<T>::basefield=0;//查找被延迟了
}
};
如果使用修改方案二,如果原来的非受限非依赖型名称是被用于虚函数调用的话,
那么引入依赖性的限定的话,那么这种引入依赖性的限定将会近之虚函数调用,
从而也会改变程序的含义,当遇到第二种情况不适合的情况,可以采用方案一
1.在一个类模板中,一个非依赖型基类是指:无须知道模板实参就可以完全确定类型的
基类。
例如:
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
class D1:public Base<Base<void> >{//实际上不是模板
public:
void f(){basefield = 3; }
};
template<typename T>
class D2:public Base<double>{
public:
void f() { basefield = 7; }//正常访问继承成员
T strange;//T是Base<double>::T,而不是模板参数
};
注意事项:对于模板中的非依赖类型而言,如果在他的派生类中查找一个非受限名称,
那就会先查找这个非依赖型基类,然后才会查找模板参数列表。
2.非依赖性名称不会在依赖基类中查找
template<typename X>
class Base{
public:
int basefield;
typedef int T;
};
template <typename T>
class DD:Base<T>{
public:
void f(){
basefield = 0;//problem
}
};
template<>
class Base<bool>{
public:
enum { basefield = 42 };//tricky
};
void g(DD<bool>& d){
d.f();//opps
}
//修改方案一
template <typename T>
class DD1:Base<T>{
public:
void f(){
this->basefield=0;//查找被延迟了
}
};
//修改方案二
template <typename T>
class DD2:Base<T>{
public:
void f(){
Base<T>::basefield=0;//查找被延迟了
}
};
如果使用修改方案二,如果原来的非受限非依赖型名称是被用于虚函数调用的话,
那么引入依赖性的限定的话,那么这种引入依赖性的限定将会近之虚函数调用,
从而也会改变程序的含义,当遇到第二种情况不适合的情况,可以采用方案一
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询