шаблонные классы в разных файлах [дубликат]

115
19 октября 2021, 21:00
На этот вопрос уже даны ответы здесь:
Шаблоны C++ , undefined reference to (2 ответа)
Вынести метод шаблонного класса в .cpp (3 ответа)
Шаблоны в модуле .cpp? [дубликат] (1 ответ)
Не работает обьявление шаблона класса в заголовочном файле с определением методов в отдельном файле реализации (3 ответа)
Закрыт 1 год назад.

написал на взгляд ОБСОЛЮТНО рабочий код, но он не работает(

помогите!

main.cpp:

#include <iostream>
#include <string>
#include "classes/Dinamic/Dinamic.h"
#include "classes/Person/Person.h"
using namespace std;
#define RETURN return 0
int main()
{
    setlocale(LC_ALL,"ru");
    cin.exceptions(ios::failbit | ios::badbit);
    Dinamic<string> TEXTS_;
    TEXTS_.push_back("привет, у тебя есть задача");
    TEXTS_.push_back("реши ее и получи награду!");
    Person l("crocodile");
    l.Speak("Hello");
    RETURN;
}

Dinamic.cpp:

#include <iostream>
#include <string>
#include "Dinamic.h"
using namespace std;
        //Constructor
    template<class T>Dinamic<T>::Dinamic()
    {
        size_=0;
        __Array = new T[size_]; //create empty array
    }
        //Destructor
    template<class T>Dinamic<T>::~Dinamic()
    {
        delete[] __Array; //clean memory
    }
        //method push back
    template<class T>void Dinamic<T>::push_back(const T& value)
    {
        T* array_buffer = new T[(this->size_)+1]; //create new array
        for(int i = 0; i < this->size_; i++)
        {
            array_buffer[i] = __Array[i];
        }
        array_buffer[this->size_] = value; //add new element
        size_++;
        delete[] __Array; //clean old array
        __Array = array_buffer; //update pointer
    }
        //method Print all array
    template<class T>void Dinamic<T>::PrintAllElementInArray(const string& separation)
    {
        for(int i = 0; i < this->size_; i++)
        {
            if(i==(this->size_-1)) //if final iteration
            {
                cout<<__Array[i]<<endl;
                break;
            }
            cout<<__Array[i]<<separation;
        }
    }
        //method pop back
    template<class T>void Dinamic<T>::pop_back()
    {
        size_--;
        T* array_buffer = new T[this->size_];
        for(int i = 0; i < this->size_; i++)
        {
            array_buffer[i] = __Array[i];
        }
        delete[] __Array;
        __Array = array_buffer;
    }
        //return element by index
    template<class T>T& Dinamic<T>::ElementByIndex(const int& index)
    {
        return __Array[index];
    }
        //Get size
    template<class T>int& Dinamic<T>::size()
    {
        return size_;
    }
        //is empty?
    template<class T>bool Dinamic<T>::empty()
    {
        if(this->size_ > 0) {
            return false;
        }
        else {
            return true;
        }
    }
        //resize array
    template<class T>void Dinamic<T>::resize(const int& New_size,const T& values)
    {
        T* array_buffer = new T[New_size];
        for(int i = 0; i < this->size_; i++)
        {
            array_buffer[i]=__Array[i];
        }
        for(int i = (this->size_); i<New_size;i++)
        {
            array_buffer[i] = values;
        }
        this->size_ = New_size;
        delete[] __Array;
        __Array = array_buffer;
    }

Dinamic.h:

#ifndef _IS_GUARD_
#define _IS_GUARD_
#include <string>
#include <iostream>
using namespace std;

template<class T>
class Dinamic
{
public:
    Dinamic();
    ~Dinamic();
    void push_back(const T& value);
    void PrintAllElementInArray(const string& separation="\n");
    void pop_back();
    T& ElementByIndex(const int& index);
    int& size();
    bool empty();
    void resize(const int& New_size,const T& values=0);
private:
    int size_; //size array
    T* __Array; //main array
};

#endif //   _IS_GUARD_

Person.cpp:

#include <iostream>
#include <string>
#include "../Dinamic/Dinamic.h"
#include "Person.h"
using namespace std;
Person::Person(string name)
{
    this->name=name;
}
void Person::Speak(const string& text)
{
    cout<<name<<": "<<text<<endl;
}
template<class T>void Person::give_quest(
                                        Dinamic<string>* texts,
                                        const string& quest,
                                        const T& answer
                                                                    )
{
    for(int i = 0; i < texts->size(); i++)
    {
        cout<<texts->ElementByIndex(i)<<endl;
    }
    cout<<quest<<endl;
    string buffer;
    cin>>buffer;
    if(buffer==to_string(answer))
    {
        cout<<"Верно!"<<endl;
    }
    else
    {
        cout<<"Неверно!"<<endl;
    }
}

Person.h:

#ifndef _IS_GUARD_PENSON_
#define _IS_GUARD_PERSON_
#include <iostream>
#include <string>
#include "../Dinamic/Dinamic.h"

using namespace std;
class Person
{
public:
        //Constructor
    Person(string);
    void Speak(const string&);
    template<class T>void give_quest(Dinamic<string>*, const string&, const T&);

private:
    string name;
};
#endif //_IS_GUARD_PERSON_

Компилирую через g++ такой командой:

clear;
g++ main.cpp classes/Dinamic/Dinamic.cpp classes/Person/Person.cpp -o Programm;
./Programm

Структура проекта соответствует!

сама ошибка:

Answer 1

У вас код, описывающий работу шаблона, должен находится в одной единице трансляции. Другими словами вам необходимо всю реализацию методов и т.д. перенести в соответствующие .h файлы.

READ ALSO
Не удается открыть файл включение: No such file or directory QT CREATOR

Не удается открыть файл включение: No such file or directory QT CREATOR

Пишу приложение, использую qt creator в качестве ide, и понадобилось мне использовать SFML, но возникла проблема: вpro файл добавил код для подключения...

214
Семафор (теория)

Семафор (теория)

Представим у нас есть разделяемый буфер размером в 4 записи

164
Как создать динамичную смену картинок при нажатии в ReactJS

Как создать динамичную смену картинок при нажатии в ReactJS

поставил себе задачу при клике на картинку like менять ее на другую в посте, чтобы пользователь понимал, что, что-либо поменялось в initialState у posts добавил...

146
Как распарить файл объектов с одинаковыми ключами в JSON?

Как распарить файл объектов с одинаковыми ключами в JSON?

У меня есть текстовый файл с множеством объектов с одинаковыми именами и множеством координат, как его распарсить в jsonКак правильно его распарсить?...

212