2016-03-10 5 views
0

Я пытаюсь использовать абстрактный базовый класс шаблонов. Компилятор дает ошибки в RowArray.cpp, что члены rowPntr и rowSize «не объявлены в этой области». Оба являются защищенными членами от абстрактного класса AbsRow. Я предполагаю, что этот проект невозможен, поскольку он использует виртуальные функции, которые динамически связаны во время выполнения, но в то же время использует шаблон, который привязан во время компиляции. Возможно, смешение этих двух вопросов? Что я хотел бы знать, так это, если мой проект возможен, и почему я получаю эти ошибки компилятора? Я также забыл упомянуть, что при создании объекта RowArray RowArray<int> obj(5); я получаю ошибку связи 2019 в визуальной студии и в создателе Qt, это говорит мне неопределенное уважение к конструктору и деструктору RowArray.C++ Abstract Template Class

Абстрактный класс AbsRow.h

template <typename T> 
class AbsRow 
{ 
public: 

    virtual int getSize()const = 0; 
    virtual T getValue(int index)const = 0; 

protected: 

    T *rowPntr; 
    int rowSize; 
}; 

производный класс RowArray.h

#include "absrow.h" 

template <class T> 
class RowArray : public AbsRow<T> 
{ 
public: 

    RowArray(const int rows); 
    virtual ~RowArray(); 

    virtual T getValue(int index) const override; 
    virtual int getSize() const override; 

    void setValue(int row, int value); 
}; 

RowArray.cpp

#include "rowarray.h" 
#include <cstdlib> 

template <class T> 
RowArray<T>::RowArray(const int rows) 
{ 
    rowSize = rows; 
    rowPntr = new int[rows]; 

    for(int index = 0; index < rows; index++) 
    { 
     rowPntr[index] = (rand() % 90) + 10; 
    } 
} 

template <class T> 
RowArray<T>::~RowArray() 
{ 
    delete [] rowPntr; 
} 

template <class T> 
void RowArray<T>::setValue(int row, int value) 
{ 
    rowPntr[row] = value; 
} 

template <class T> 
int RowArray<T>::getSize() const 
{ 
    return rowSize; 
} 

template <class T> 
T RowArray<T>::getValue(int index) const 
{ 
    return rowPntr[index]; 
} 

Главная

#include "rowarray.h" 

int main() 
{ 
    RowArray<int> row(7); 
} 
+0

ли 'this-> rowPntr' и' this-> rowSize' помочь? –

+0

Я думал об этом, но не потрудился попробовать, потому что я убедился, что это не проблема. Я стыжусь своей головой. –

+1

Возможный дубликат [Произвольный доступ к шаблону шаблона для данных-членов базового класса] (http://stackoverflow.com/questions/1120833/derived-template-class-access-to-base-class-member-data) –

ответ

1

Вы можете обратиться, что в основном двумя способами ... Принимая укороченный пример вашей RowArray.cpp ... (я исправил проблему в вашем выражении new)

template <class T> 
RowArray<T>::RowArray(const int rows) 
{ 
    AbsRow<T>::rowSize = rows 
    // or 
    //this->rowSize = rows; 

    AbsRow<T>::rowPntr = new T[rows]; ///Corrected 'int' to 'T' because rowPntr is of type 'T*' in your AbsRow class 
    // or 
    //this->rowPntr = new T[rows]; 

    for(int index = 0; index < rows; index++) 
    { 
     AbsRow<T>::rowPntr[index] = (rand() % 90) + 10; 
     // or 
     //this->rowPntr[index] = (rand() % 90) + 10; 
    } 
} 
0

Я думаю, что ошибка происходит из тот факт, что вы помещаете шаблон шаблона (производный класс по-прежнему является шаблоном) в файл CPP. Компилятор должен увидеть всю реализацию шаблона, что обычно означает, что все это делается в файле заголовка.

Другая проблема заключается в том, что конструктор производного класса предполагает, что rowPntr типа int*, но это действительно T*.

+0

Я бы проголосовал за это, если У меня был представитель. Благодарю. В книге, которую я читаю, я никогда не говорил это явно, но это показано в примерах кода. Я пропустил это полностью. Благодаря! –

+0

Если это помогло решить вашу проблему, вы можете принять ее как ответ на вопрос. Ты изначальный искатель, так что это зависит от тебя. –

0

Основная причина проблемы заключается в том, что ожидается, что определения функций для класса шаблона в самом файле .h. Если вы этого не делаете, компилятор не сможет связать определение из файла .cpp. Для этого есть несколько хаков. Один из них - иметь явную инициализацию шаблона в файле .cpp.

На из RowArray.cpp добавить

template class AbsRow<int>;
template class RowArray<int>;