Ошибка «неопределенные символы для архитектуры» при отделении некоторых функций от main.cpp, что делать?

0

История

Мой 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)
Теги:
g++

1 ответ

1
Лучший ответ

Шаблоны создаются только при вызове, поэтому, если никакая функция в вашем вторичном файле.cpp вызывает showSettings с <double>, тогда функция не была создана.

Как правило, вы хотите оставить функции шаблона в файле.h, чтобы фактическое определение было видимым при необходимости.

(См. Также: Почему реализация и объявление класса шаблона должны быть в одном заголовочном файле?)

  • 0
    Позвольте мне уточнить: Вы имеете в виду, что я должен передать реализацию шаблона в файл .h и удалить его из файла .cpp ?
  • 0
    Я переместил полное определение шаблона в файл .h и добавил using namespace std . Это скомпилировано. Будет ли этого достаточно, или лучше просто указать std:: для таких вещей, как vector и string ?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню