Разделение кода. Вынесение реализации методов шаблона класса из заголовочного файла «.h» в исходный файл «.cpp»?

Не получается разделить код на шаблон класса и на реализацию методов шаблона класса.
Шаблон класса достаточно простой, имеет конструктор по умолчанию с заданным аргументом по умолчанию (аргумент задает кол-во элементов в массиве) и деструктор. Класс реализует обвертку стандартного С-шного массива.
Делаю так:
main.cpp
#include <iostream>
#include <TypeArray.h>

int main(){
    TypeArray<int> massive(5);
    return 0;
}

TypeArray.cpp
#include <TypeArray.h>

template<typename Type>
TypeArray<Type>::TypeArray(int size){
        _size = size;
        pia = new Type[_size];
        if( typeid(*pia).name() == typeid(char).name() ){
            for(int i(0); i < _size; ++i){
                pia[i] = '?';
            }
        }else{
            for(int i(0); i < _size; ++i){
                pia[i] = 0;
            }
        }
}

template<typename Type>
TypeArray<Type>::~TypeArray(){
    delete[] pia;
}

TypeArray.h
#ifndef TYPEARRAY_H
#define TYPEARRAY_H
#include <iostream>
#include <typeinfo>

using namespace std;

template <typename Type>
class TypeArray{
private:
    Type *pia;
    int _size;
public:
    //конструктор по умолчанию
    TypeArray(int size = 10);

    //Деструктор
    ~TypeArray();
};
#endif


Компилятор ругается на:
339f758a79f14c90ad2e4cbfd3790595.jpeg
  • Вопрос задан
  • 4367 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Вы либо явно инстанцируйте TypeArray в файле с реализацией, либо верните определения конструктора и деструктора обратно в заголовочный файл. Как по-вашему компилятор узнает, с какими параметрами вы инстанцируете этот шаблон в других файлах?
Ответ написан
SHVV
@SHVV
У нас для реализации темплейтов введено специальное расшерение типа ".tpl", где и описывается реализация. Этот файл инклудится прямо в конце заголовочного файла, чтобы не делать двойных инклюдов в месте использования.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы