Как разнести по файлам функцию с++

Столкнулся с проблемой, как правильно разнести объявление и реализацию фунции между между заголовочным файлом .h и .cpp. Сейчас есть такая структура программы.

.h файл

namespace problem {
  class_1 {}
  class_2 {}
  ...
  static std::vector<int> coord;
 
  static void solve(double&x, double&y) {
    //transform coord, use class_1, class_2;
  }

}

в .сpр вынесена реализация всех классов. Когда выношу реализацию функции solve в .cpp, то получаю ошибку при вызове функции problem::solve(x, y) (вызов происходит в main.cpp):

undefined reference to `problem::solve(double&, double&)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

Не могу разобраться в чём проблема.


Ответы (1 шт):

Автор решения: Bearded Beaver

У вас функция помечена как статическая, это означает (для простых функций, для членов класса и переменных значение этого ключевого слова другое) что она доступна только в пределах той же единицы трансляции, т.е. того же cpp файла, а вы ее вызываете из main.cpp.

При этом когда вы убираете реализацию в .h, при включении этого заголовочного файла в main.cpp, реализация этой функции фактически оказывается в файле main.cpp, то есть в том же файле, что и ее вызов, и ее статичности не мешает вызову.

Чтобы функцию можно было вызвать из main, уберите static

→ Ссылка