Возможный дубликат:
Почему шаблоны могут быть реализованы только в заголовочном файле?
Почему реализация и объявление класса шаблона должны находиться в одном заголовочном файле?
Я работаю над проектом, где мне нужен мой «стек» для сохранения данных. Но я не хочу кодировать разные версии для каждого типа файла (и я не хочу использовать векторы).
Поэтому я пытаюсь использовать шаблон класса, и это мой код:
StructStack.h
#ifndef STRUCTSTACK_H_
#define STRUCTSTACK_H_
template <class AnyType> class StructStack {
StructStack();
~StructStack();
struct Element {
Element *pointer;
AnyType value;
};
Element *pointerToLastElement;
int stackSize;
int pop();
void push(int value);
int size();
};
#endif
StructStack.cpp
#include "stdafx.h"#include "StructStack.h"#include <iostream>
using namespace std;template <class AnyType> void StructStack<AnyType>::StructStack() {
//code
}
template <class AnyType> void StructStack<AnyType>::~StructStack() {
//code
}
template <class AnyType> AnyType StructStack<AnyType>::pop() {
//code
}
template <class AnyType> void StructStack<AnyType>::push(AnyType value){
//code
}
template <class AnyType> AnyType StructStack<AnyType>::size() {
//code
}
Если я пытаюсь скомпилировать эти два файла, я получаю кучу ошибок компиляции. Я читал в Интернете, что довольно сложно создать шаблонный класс в многофайловом проекте.
Так как это можно сделать?
Вы можете решить эту проблему, поместив все определения (код, который у вас есть в StructStack.cpp
) в StructStack.h
и удаление первого. Компилятор должен иметь доступ к коду реализации, чтобы он мог создавать экземпляр шаблона класса по мере необходимости.
Вам просто нужно поместить определения ваших функций в заголовочный файл.
Все, что вы написали внутри StructStack.cpp
должен идти в StructStack.h
после определения класса.
Шаблонный код должен просматриваться каждым файлом, который его использует.
Он не скомпилируется, пока не станет специализированным или не используется.
В основном, если вы хотите использовать его в разных файлах, вам придется поместить его в заголовочный файл, а затем включить его. Когда вы на самом деле используете шаблоны определенного типа, код будет сгенерирован в том контексте, в котором он используется.
Код шаблонов C ++ всегда должен быть помещен в заголовочный файл, чтобы реализация была видна в каждом модуле перевода, где вы хотите создать экземпляр шаблона. Если вам нравится, вы можете разделить код на файлы * .h и * .cpp, но вы все равно должны #include * .cpp файл в конце файла * .h.