2016-03-05 126 views
1

我很新的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(); 
     } 
}; 
+0

你的意思是'bList :: bNode :: chain(node)'? – Barry

+0

對不起,我在嘗試簡化代碼以便發佈時犯了一個錯誤。原本簽名是好的。使用'this-> bList :: bNode :: chain(node);'解決了這個問題,謝謝。 – trrcore

回答

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

我已經糾正你的問題,並給予適當的回答。你的問題的問題是你沒有正確地覆蓋該功能。你的連鎖函數有不同的簽名。