对模板化类的父方法的调用 我是C++的新手,我想从他的孩子中调用一个父虚拟方法,这实际上是一个模板类。我得到以下错误: dependent-name 'bList<T>::bNode' is parsed as a non-type, but instantiation yields a type 依赖名称“bList::bNode”被解析为非类型,但实例化会生成一个类型
我看过其他帖子,尝试过不同的组合,但都没能解决对模板化类的父方法的调用 我是C++的新手,我想从他的孩子中调用一个父虚拟方法,这实际上是一个模板类。我得到以下错误: dependent-name 'bList<T>::bNode' is parsed as a non-type, but instantiation yields a type 依赖名称“bList::bNode”被解析为非类型,但实例化会生成一个类型,c++,templates,C++,Templates,我看过其他帖子,尝试过不同的组合,但都没能解决 template <class T> class bList { protected: class bNode { // PARENT METHOD: public: virtual void chain() { // do something...
template <class T>
class bList {
protected:
class bNode
{
// PARENT METHOD:
public:
virtual void chain() {
// do something...
}
};
protected:
virtual bNode* makeNode(T& data) {
return new bNode();
}
};
template <class T>
class cList : public bList<T> {
protected:
class cNode : public virtual bList<T>::bNode {
// CHILD METHOD:
public:
virtual typename bList<T>::bNode* chain(typename bList<T>::bNode* node) {
// if (...) {
// return ...
// }
// else {
return bList<T>::bNode.chain(node); // <- error!
// }
}
};
protected:
virtual typename bList<T>::bNode* makeNode(T& data) {
return new cNode();
}
};
模板
类布利斯特{
受保护的:
B类节点
{
//父方法:
公众:
虚空链(){
//做点什么。。。
}
};
受保护的:
虚拟bNode*makeNode(T&data){
返回新的bNode();
}
};
模板
类cList:公共bList{
受保护的:
类cNode:公共虚拟bList::bNode{
//子方法:
公众:
虚拟typename bList::bNode*链(typename bList::bNode*节点){
//如果(…){
//返回。。。
// }
//否则{
返回bList::bNode.chain(节点);//模板
类布利斯特{
受保护的:
B类节点
{
//父方法:
公众:
虚拟typename bList::bNode*节点链(typename bList::bNode*节点){
//做点什么。。。
}
};
受保护的:
虚拟bNode*makeNode(T&data){
返回新的bNode();
}
};
模板
类cList:公共bList{
受保护的:
类cNode:公共虚拟bList::bNode{
//子方法:
公众:
虚拟typename bList::bNode*链(typename bList::bNode*节点){
//如果(…){
//返回。。。
// }
//否则{
返回此->bList::bNode::chain(节点);
// }
}
};
受保护的:
虚拟类型名bList::bNode*makeNode(T&data){
返回新的cNode();
}
};
我已经更正了您的问题并给出了正确的答案。您的问题的问题是您没有正确重写函数。您的链函数具有不同的签名。模板
类布利斯特{
受保护的:
B类节点
{
//父方法:
公众:
虚拟typename bList::bNode*节点链(typename bList::bNode*节点){
//做点什么。。。
}
};
受保护的:
虚拟bNode*makeNode(T&data){
返回新的bNode();
}
};
模板
类cList:公共bList{
受保护的:
类cNode:公共虚拟bList::bNode{
//子方法:
公众:
虚拟typename bList::bNode*链(typename bList::bNode*节点){
//如果(…){
//返回。。。
// }
//否则{
返回此->bList::bNode::chain(节点);
// }
}
};
受保护的:
虚拟类型名bList::bNode*makeNode(T&data){
返回新的cNode();
}
};
我已经更正了您的问题并给出了正确的答案。您问题的问题是您没有正确重写函数。您的链函数具有不同的签名。您的意思是bList::bNode::chain(node)
?抱歉,我在试图简化代码以便发布时出错。最初签名是可以的。使用this->bList::bNode::chain(node);
解决了问题,谢谢。你是说bList::bNode::chain(node)
?抱歉,我在试图简化代码以便发布时出错。最初签名是可以的。使用this->bList::bNode::chain(node);
解决了问题,谢谢。
template <class T>
class bList {
protected:
class bNode
{
// PARENT METHOD:
public:
virtual typename bList<T>::bNode* node chain(typename bList<T>::bNode* node) {
// do something...
}
};
protected:
virtual bNode* makeNode(T& data) {
return new bNode();
}
};
template <class T>
class cList : public bList<T> {
protected:
class cNode : public virtual bList<T>::bNode {
// CHILD METHOD:
public:
virtual typename bList<T>::bNode* chain(typename bList<T>::bNode* node) {
// if (...) {
// return ...
// }
// else {
return this->bList<T>::bNode::chain(node);
// }
}
};
protected:
virtual typename bList<T>::bNode* makeNode(T& data) {
return new cNode();
}
};