Я занимаюсь разработкой библиотеки C ++, в которой мне нужно предоставить шаблон класса пользователю.
Параметр шаблона этого класса является справочным. Однако я получаю ошибку компоновщика. Вот минимальный тестовый пример:
test.hh
#ifndef TEST_HH_
#define TEST_HH_
template <double const& val>
struct A{};
constexpr double zero = 0.;
A<zero> foo();
#endif // TEST_HH_
test.cpp
#include "test.hh"
A<zero> foo(){ return A<zero>(); }
main.cpp
#include "test.hh"
int main()
{
foo();
}
При компиляции этого фрагмента кода я получаю предупреждение:
'A<zero> foo()' used but never defined
с последующей ошибкой компоновщика:
undefined reference to foo()
Я пытался заменить double на int:
template <int val>
struct A{};
и он связан (при передаче int
в качестве параметра ofc), но мне действительно нужен double
.
Я также попробовал общее решение, когда класс шаблона связан с ошибкой компоновки, я реализовал функцию foo()
в test.hh
вместо test.cpp
, но я хотел бы избежать размещения всего кода в заголовке.