Проблемы наследования шаблонов - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть Abstractqueue, и я хочу наследовать ее члены другому дочернему классу.Когда я пытаюсь создать дочерний объект в моем главном файле, я получаю неопределенную ссылку на `AbstractQueue :: AbstractQueue () '

enter code here
#ifndef ABSTRACT_QUEUE_H
#define ABSTRACT_QUEUE_H

#include <iostream>

template <class Type>
class AbstractQueue
{
protected:
    Type *items;
    int front;
    int back;
    int capacity;
    int count;
private:
    // data goes here

public:
    AbstractQueue(int s);

   AbstractQueue(void);

   ~AbstractQueue(void);

   bool empty();

   int size();

   Type frontele(); //throw(exception) {}

   Type dequeue(); //throw(exception) {}

   void enqueue ( Type e );
};

template <class Type>
AbstractQueue<Type>::AbstractQueue(int s){
    items = new Type[s];
    front = 0;
    back = 0;
    capacity = s;
    count = 0;
    std::cout << "made the abstract queue!" << std::endl;

}

template <class Type>
AbstractQueue<Type>::~AbstractQueue() {
    delete[] items;
    std::cout << "destructor called" << std::endl;
}

#endif

IncrementalQueue.h

#ifndef _INCREMENTALQUEUE_H
#define _INCREMENTALQUEUE_H

#include "Queue.h"

//#define SIZE = 10

#include <iostream>

template <class Type>
class IncrementalQueue : public AbstractQueue<Type>{

    public:
        //AbstractQueue(void);

       //~AbstractQueue(void);

       IncrementalQueue(int s);

       bool empty();

       int size();

       Type frontele(); //throw(exception) {}

       Type dequeue(); //throw(exception) {}

       void enqueue ( Type e );



    //~IncrementalQueue(void);



    //AbstractQueue(void);

    //AbstractQueue(int size);

    //bool empty(void) ;
        /*if (count == 0) {
        return true;
        }
        else {
        return false;
        }*/

    //int size(void);

    //Type front throw(exception) {}

    //Type dequeue(); //throw(exception) {}

    //void enqueue ( Type e ) ;

        //IncrementalQueue(int size);
};
template <class Type>
IncrementalQueue<Type>::IncrementalQueue(int s){
    this->items = new Type[50];
    this->front = 0;
    this->back = 0;
    this->capacity = 50;
    this->count = 0;
    std::cout << "made the incremental queue!" << std::endl;

}


#endif

main.cpp

#include "Queue.h"
#include "IncrementalQueue.h"

int main(){

    IncrementalQueue<int> incqueue(50);


    return 0;
}

Я немного устал от шаблонов, поэтому я боролся с этим пару часов.У кого-нибудь есть какие-либо подсказки, где мой код может давать сбой?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

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

template class AbstractQueue<NeededType>;

В вашем случае невозможно знать все возможные аргументы шаблона заранее, поэтому вам нужно поместить тело функции в заголовок.Это цена отдельной единицы компиляции.

0 голосов
/ 20 сентября 2018

IncrementalQueue::IncrementalQueue() конструктор вызывает конструктор AbstractQueue::AbstractQueue(), и вы не определили его.

Чтобы сделать его компилируемым, вы можете просто сказать AbstractQueue() = default;, чтобы он был сгенерирован компилятором, если вы используетеC++11 или позже, , но , что не обязательно будет правильным (см. Комментарии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...