2016-12-19 59 views
1

我的一些構造函數有問題。這兩個子類都需要得到相同的類(沒有超類),這就是爲什麼這些類應在父類被初始化:成員初始化程序'SuperClass'沒有命名非靜態數據成員或基類

template<typename T, typename S> 
class SuperClass { 
protected: 
    OtherClass <T> const& _class1; 
    OtherOtherClass <T> const& _class2; 

    SuperClass() { 

    } 

    SuperClass(OtherClass<T> const& class1, OtherOtherClass<T> const& class2) 
     : _class1(class1), _class2(class2) 
    { 
      // Alternative I tried: 
      // this->_class1 = class1; 
      // this->_class2 = class2; 
    } 

我試圖通過使用它:

template<typename T, typename S> 
    class SubClass1 : public SuperClass<T, S> { 
    private: 
     someFunc() { 
      return this->_class1.getSomething(); // as an example 
     } 

    public: 
     SubClass1(OtherClass<T> const& class1, 
       OtherOtherClass<T> const& class2) 
       : SuperClass(class1, class2) 
      { 
       // some definitions 
      } 

    } 

之後此錯誤顯示出來:

成員初始化 '父類的不名非靜態數據成員或基 類

我發現一些有類似問題的人,但並沒有讓我找到解決辦法。例如:member initializer does not name a non-static data member or base class 我沒有看到很多差異,並試圖添加一個像他一樣的空構造函數。

+2

請提供一個[mcve] – Barry

+0

你可以顯示類'SubClass1'的定義嗎? –

+0

是否應該閱讀SuperClass (...)? –

回答

4

錯誤說明了一切:

成員初始化「SuperClass」沒有指定非靜態數據成員或基類

SuperClass是不是一類。這是一個類模板。因此,它不是您類型的基類。基類是類模板的特定實例:SuperClass<T,S>。這就是你需要的:

SubClass1(OtherClass<T> const& class1, 
      OtherOtherClass<T> const& class2) 
    : SuperClass<T,S>(class1, class2) 
    //   ^^^^^