мои шаблоны не работают (C ) — я делаю что-то не так?

#c #templates

#c #шаблоны

Вопрос:

здесь я определяю свой шаблон и 3 дополнительных класса

 #ifndef PLANILHAH
#define PLANILHAH

#include <iostream>
#include "planilha_func.h"

template <class TIPO> class planilha {
    friend class celula;
    friend class listaT;
    friend class elo;
    protected:
    celula * primeiro;
    unsigned int count;
    public:
    planilha();
    planilha(const planilha<TIPO>amp; origem);
    ~planilha(void)
    TIPO obtem_valor(const unsigned int num_cel);
    //many more methods
};
  

я не знаю, должен ли я сделать это вложенным классом в ‘planilha’ или нет, если я сделаю его вложенным, как мне это реализовать? он должен получить тип ‘TIPO’

 template <class TIPO> class celula{
    friend class listaT;
    friend class elo;
    protected:
    unsigned int idCelula;
    TIPO constante;
    TIPO total;
    listaT termos;
     //etc
    void insere(int novoCons);
    void apaga();
    void setIdCelula(unsigned int idCelula);
    void setTotal(TIPO total);
    TIPO getTotal() const;
    TIPO getConstante() const;
    void setConstante(TIPO constante);

};
  

Я не знаю, является ли класс friend лучшим вариантом, они используются в классе celula

 class listaT {
    friend class elo;
    protected:
    elo * primeiro;
    public:
    listaT();
    ~listaT();
    listaT(listaTamp; origem);
};

class elo {
    friend class listaT;
    protected:
    elo();
    elo(unsigned int novaRef, double novoFator, bool x = true, elo * proxElo = NULL);
    elo operator=(const eloamp; origem);
};

#endif;
  

вот где я их внедряю, я получаю 100 ошибок или больше. я не могу понять, почему

 #include "planilha.h"
#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

template <class TIPO>
planilha<TIPO>::planilha() {
    primeiro = NULL;
    count = 1;
}

template <class TIPO>
planilha<TIPO>::~planilha(void) {
    celula * p = primeiro;
    while(primeiro!=NULL) {
        p=primeiro->prox;
        delete primeiro
        primeiro=p;
    }
}

template <class TIPO>
planilha<TIPO>::planilha(const planilha<TIPO>amp; origem) {
    this->count = origem.count;
    celula * p1;
    this->primeiro = NULL;
    celula * p2;
    for(p2 = origem.primeiro; p2!=NULL; p2=p2->prox) {
        p1 = p2;
        if(this->primeiro == NULL) {
            this->primeiro = p1;
        }
        p1 = p1->prox;
    }
}


template <class TIPO>
unsigned int planilha<TIPO>::getCount() const {
    return count;
}

template <class TIPO>
void typename planilha<TIPO>::setCount(unsigned int count) {
    this->count = count;
}

template <class TIPO>
celula * planilha<TIPO>::finder(unsigned int id) {
    celula * resposta;
    for(resposta=this->primeiro; resposta!=NULL; resposta=resposta->prox) {
        if(resposta->idCelula == id) break;
    }
    return resposta;
}

template <class TIPO>
celula<TIPO>::celula() {
    prox = NULL;
}

template <class TIPO>
celula<TIPO>::celula(unsigned int novoId, TIPO novaConstante, planilha<TIPO> * proxCel) {
    idCelula = novoId;
    constante = novaConstante;
    total = novaConstante;
    prox = proxCel;
}



template <class TIPO>
void celula<TIPO>::setTotal(TIPO total) {
    this->total = total;
}


listaT::listaT() {
    this->primeiro = NULL;
}

listaT::~listaT() {
    elo * p = primeiro;
    while(primeiro!=NULL) {
        p=primeiro->prox;
        delete primeiro;
        primeiro=p;
    }
}

listaT::listaT(listaTamp; origem) {
    elo * p2;
    elo * p1;
    primeiro = NULL;
    for(p2 = origem.primeiro; p2!=NULL; p2 = p2->prox) {
        p1 = p2;
        if(primeiro == NULL) {
            primeiro = p1;
        }
        p1 = p1->prox;
    }
}

bool listaT::vazia() {
    return (primeiro == NULL);
}

void listaT::insere(int novaRef, double novoFator, bool absoluta) {
    elo * p = primeiro;
    elo * novoElo = new elo(novaRef, novoFator, absoluta);
    if(vazia()) {
        primeiro = novoElo;
    } else {
        while(p->prox!=NULL) {
            p = p->prox;
        }
        p->prox = novoElo;
    }
}

bool listaT::operator==(const listaT amp;listaT2) {
    elo * p1 = this->primeiro;
    elo * p2 = listaT2.primeiro;
    bool resposta = true;
    while(p1!=NULL amp;amp; p2!=NULL) {
        if(p1->fator != p2->fator || p1->referencia != p2->referencia || p1->absolut != p2->absolut) {
            resposta = false;
        }
        p1=p1->prox;
        p2=p2->prox;
    }
    if(p2!=NULL || p1!=NULL) {
        resposta = false;
    }
    return resposta;
}

elo * listaT::getPrimeiro() {
    elo * resposta;
    resposta = primeiro;
    return resposta;
}

elo::elo() {
    prox = NULL;
}

elo::elo(unsigned int novaRef, double novoFator, bool x, elo * proxElo) {
    referencia = novaRef;
    fator = novoFator;
    prox = proxElo;
    absolut = x;
}

elo elo::operator=(const eloamp; origem) {
    unsigned int r = origem->referencia;
    double f = origem.fator;
    bool x = origem.absolut;
    elo p(r, f, x);
    return p;
}
  

Комментарии:

1. Существует миллиард вариантов решения этой проблемы.

2. Пожалуйста, сократите свой код до самого простого из возможных, в котором проявляется проблема.

3. Прочитайте, на что жалуется компилятор, и исправьте все ошибки и предупреждения. В конце ваша программа будет скомпилирована. кстати, в чем ошибки?

4. ожидаемый конструктор, деструктор или преобразование типа перед токеном ‘<‘

5. Пожалуйста, опубликуйте сообщение об ошибке, актуальный вопрос и в 10 раз меньше бесполезного кода.

Ответ №1:

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

Комментарии:

1. мой учитель сказал мне создать один файл с определениями, другой с методами

2. все, что у меня есть, это два файла .h и один main.cpp включая эти два заголовка

3. обычно вам действительно нужно поместить исходный код в тот же файл, что и заголовок для шаблонов классов

4. В вашем файле .h попробуйте ввести #, включая ваш файл .cpp

5. итак, мое определение класса и фактическая реализация методов должны быть в одном файле .h для класса template?