Я разрабатываю библиотеку C++, где мне нужно предоставить пользователю шаблон класса.
Параметр шаблона этого класса является ссылкой. Однако я получаю ошибку компоновщика. Вот минимальный тестовый пример:
тест.чч
#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
, но я хотел бы избежать простого размещения всего кода в заголовке.