调用模板化类的父方法

时间:2016-03-05 16:07:12

标签: c++ templates

我对c ++很新,我试图从他的孩子那里调用父虚拟方法,这实际上是一个模板化的类。我收到以下错误:

dependent-name 'bList<T>::bNode' is parsed as a non-type, but instantiation yields a type

我已经审核了其他帖子并尝试了不同的组合,但未设法解决它。

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();
        }
};

1 个答案:

答案 0 :(得分:0)

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();
        }
};

我已经纠正了你的问题并给出了正确的答案。您的问题的问题是您没有正确地覆盖该功能。您的链函数具有不同的签名。