История
Мой main.cpp
становится действительно загроможденным, поэтому я решил отделить от него другие функции (некоторые вспомогательные функции для операций ввода-вывода в main()
).
Проблема
Файлы компилируются отлично, когда функции находятся в main.cpp
. Когда я помещаю их в пару .h -.cpp
, я получаю следующую ошибку компилятора.
Линия, которую я использую:
g++ -I ./headers/ ./definitions/*.cpp -o main.o main.cpp
Ошибка:
Undefined symbols for architecture x86_64:
"void showSettings<double>(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> >,
std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> > > > const&,
std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >,
std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> > > > const&, int, int, double, double, int, int, int, int, int)",
referenced from:
_main in main-7k1oIa.o
ld: symbol(s) not found for architecture x86_64
Единственное рабочее решение прямо сейчас - вернуть функции main.cpp
. Я включил все необходимые заголовки, using namespace std
и добавляя std::
в vector
и string
но ошибка продолжает отображаться.
Если какая-либо помощь, код, который появляется в ошибке:
template <typename inputType>
void showSettings( const vector<string> &a,
const vector<string> &b,
int eq,
int meth,
inputType root1,
inputType root2,
int sigs,
int showPerLoop,
int plotRoots,
int loopMode,
int minLoops)
Шаблоны создаются только при вызове, поэтому, если никакая функция в вашем вторичном файле.cpp вызывает showSettings с <double>
, тогда функция не была создана.
Как правило, вы хотите оставить функции шаблона в файле.h, чтобы фактическое определение было видимым при необходимости.
(См. Также: Почему реализация и объявление класса шаблона должны быть в одном заголовочном файле?)
.h
и удалить его из файла .cpp
?
.h
и добавил using namespace std
. Это скомпилировано. Будет ли этого достаточно, или лучше просто указать std::
для таких вещей, как vector
и string
?