Konstruktor klasy podstawowej i szablony funkcji

0

Problem ideowy: Klasa wielomian dziedziczy po klasie lista. Lista jest używana do przechowywania współczynników wielomianu.
Przy inicjalizacji wielomianu kompilator wyrzuca błąd, że nie wie którego przeciążonego konstruktora listy użyć. Jak go przekonać, aby zainicjalizował wielomian tak jak listę, czyli (stopień, wartoś typu T)? Ponadto pola number i item w klasie wielomian były niewidoczne. Wyczytałem, że using list<T>::item za łatwia sprawę, jak jeszcze da się to obejść?

 
template<class T> class list {
public:
    list(int n=0):number(n), item(n ? new T*[n]:0){}
    list(int n=0, const T&t):number(n),item(n ? new T*[n]:0){
        for(int i=0;i<number;i++)
            item[i]= new T(t);
    }// constructor with T argument
    list(const list<T>& l):number(l.number),item(l.number? new T*[l.number]:0){
    for(int i=0;i<l.number;i++)
        if(l.item[i]) item[i]=new T(*l.item[i]);
    }//copy constructor
    ~list(){
        for(int i =0;i<number;i++)
            delete item[i];
        delete [] item;
    }
    int size() const{
        return number;
    }
    T& operator()(int i){
        if(item[i]) return *(item[i]);
    } // read-write operator
    const T& operator[](int i){
        if(item[i]) return *(item[i]);
    } // read-only item
    const list<T>& operator=(const list<T>&l){
    if(this!=&l){
        if(number>l.number)
            delete [] (item + l.number);
        if(number<l.number)
            delete [] item;
        item = new T*[l.number];

    for(int i=0;i<l.number;i++)
        if(l.item[i])item[i] = new T(*l.item[i]);
    }
    return *this;
}//assignment operator

protected:
    int number;
    T** item;

};

Klasa wielomian

 
template<class T> class polynomial: public list<T> {
public:
    using list<T>::item;
    using list<T>::number;
    polynomial(int n = 0){
        number=n;
        item = n ? new T*[n] :0;
        for(int i=0;i<n;i++)
            item[i]=0;
    }
    polynomial(int n, const T&t){
        number = n;
        item=n?new T*[n]:0;
        
        for(int i=0;i<n;i++)
            item[i]=new T(t);
    }
  int degree() {
        return (number-1);
  }

};
1

Masz napisane dokładnie o co chodzi w komunikacie o błędzie. Przy konstruktorze klasy polynomial musisz podać, którego konstruktora użyć dla klasy bazowej. Spróbuj tak:

template<class T> class polynomial: public list<T> {
public:
    polynomial(int n = 0):list<T>(n) {}
    polynomial(int n, const T&t):list<T>(n,t) {}
  int degree() {
        return (number-1);
  }
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1