/***You willl find good information in the answer selected and comments of post by @datell*****/
/**** Also there is something related to use off "modules" and "inline before template" (i am asking on template classes and not template functions, both are different) in c++, that if its related, i cant relate in reality(i am a noob)*****/
я спрашиваю, как я могу включить файл заголовка в мой main.cpp, я реализовал основные операции стека в нем; main.cpp btack.h и btack.cpp.
Компилятор выдает длинный список ошибок компоновки (работает нормально, если я даю объявление и определение в btack.h, конечно, я не хочу делать это для модульности).
это утешительный класс. я предоставлю код, который работает, то есть без btack.cpp
main.cpp
#include <iostream>
using namespace std;
#include "btack.h"int main() {
char a;
int z;
//std::cout << "Hello, World!\n";
btack <int> b(3);
btack <char> c(3);
b.push(4);
b.push(5);
btack.h
#ifndef btack_h
#define btack_h
#include <iostream>
using namespace std;
template <typename s> class btack
{
int TOS,size;
s *ptr;
public:
btack(int );
~btack();
void push(s ob);
s pop();
};
template <typename s> btack<s>::btack(int i)
{
ptr = (s*)malloc(i*sizeof(s));
TOS=0;
size=i;
}
template <typename s> void btack<s>::push(s ob)
{
if(TOS>=size)
{
cout<<"stack is full"<<endl;
return;
}
ptr[TOS]=ob;
TOS++;
}
template <typename s> s btack<s>::pop()
{
if(TOS<=0)
{
cout<<"stack is empty"<<endl;
return ((s) 0);
}
TOS--;
return ptr[TOS];
}
template <typename s> btack<s>::~btack()
{free(ptr);}
#endif /* btack_h */
так что в основном я просматривал так много сообщений в Интернете и обнаружил, что вам нужно использовать ключевое слово «Экспорт», но это слово больше не используется, я не смог найти подходящего руководства по этой теме. СЕЙЧАС стандарты С ++, пожалуйста.
Руководство, как я могу узнать эту вещь с нуля.
Пожалуйста, могучие кодеры, поможет направляющая ссылка.
Обновить********
Для всех, кто говорит о явном объявлении типов данных в конце заголовка:
Предположим, что это STL-реализация stack.h, вы явно не создаете экземпляры различных типов типов данных, которые вы хотите использовать, это автоматически делает это
очки стоит:
C ++ 14 на самом деле не допускает абстрактных шаблонов … В некотором смысле они должны быть «конкретными» (реализовано в заголовочных файлах) — Василий Старынкевич
На практике компилятор C ++ 14 должен знать для каждого типа агрегата (в частности, инстанцирован шаблоны классов) его размер, выравнивание, виртуальные таблицы (если есть) и последовательность полей — с их типом и выравниванием -.
Следовательно, шаблоны практически не абстрактные типы, даже если программисты должны рассматривать их таким образом.
Поэтому стандарт контейнеры заголовки (как <vector>
, <map>
и т.д …) как правило, в том числе много внутренний материал, определяющий внутренняя реализация шаблона, и все функции-члены шаблона являются встроенными.
На практике стандартный заголовок вроде <vector>
расширен до многих вещей (около десяти тысяч строк C ++ на моем компиляторе GCC 6 в Linux).
Попробуйте следующую команду (это предварительная обработка) с простым файлом mytest.cc
имеющий #include <vector>
:
g++ -C -E -H -Wall mytest.cc > mytest.ii
-H
Опция показывает все внутренние включенные файлы. -C -E
просит предварительно обработанную форму с комментариями в mytest.ii
, Затем посмотрите с помощью редактора (или пейджера) на сгенерированный mytest.ii
; это было бы довольно большим.
И именно поэтому компиляция C ++ часто идет медленно.
Модули — будущая особенность C ++, которая может помочь. Увидеть этот вопрос.
Поскольку вы используете шаблонный класс, вам не нужен какой-либо файл .cpp для его реализации.
Итак, вы получили два файла: main.cpp
а также btack.h
, Основное содержит #include "btack.h"
,
Вы компилируете это с g++ main.cpp
,
три отдельных файла
btack.cpp
с кодом cpp для btack
btack.h
заголовочный файл
main.cpp
в main.cpp
; на первой строке просто напиши
#include "btack.h"
если btack находится в том же каталоге; если это не так, напишите путь к файлу
затем скомпилировать main.cpp
а также btack.cpp
(не забудьте также
#include "btack.h"
в btack.cpp
)