我有模板类List:
template<class T>
class List{
protected:
element<T>* head;
//...
};
我有从List继承的模板类Set:
template<class T>
class Set: public List<T>{
public:
void insert(const T& t){
if(!has(t))
pushFront(t);
}
bool has(const T& t){
bool is=false;
element<T>* tmp=head;
while(tmp && !is){
if(Comparator::compare(t, tmp->key))
is=true;
tmp=tmp->next;
}
return is;
}
};
我的问题是,当我想在没有任何其他内容的情况下使用行element<T>* tmp=head;
时,我会收到错误'head' was not declared in this scope
,但是当我在此行前面添加List<T>::
时{{1}一切正常。为什么我得到这个错误,当head受到保护并且我使用公共继承?
答案 0 :(得分:0)
这是因为分配了&#34; element<T>* tmp
&#34;不要去掉T参数,
所以,tmp被称为非独立名称。另一方面,List依赖于
模板参数T so List称为从属名称。
问题:查找时,编译器不会查找依赖的基类(如List) 非独立名称(如头部)。
解决方案:
element<T>::head
。这是您目前的解决方案,但请注意......
如果head是一个虚函数,这可能不会给你你想要的东西,因为它会禁止虚拟
派遣机制。