Итак, у меня есть следующая функция в заголовочном файле point2D.h:
static VectorXY<T> create_x_y_vectors(const std::vector<Point2D<T>>& point_vector);
Затем в файле point2D.cpp я использую эту функцию следующим образом:
template <typename T>
static VectorXY<T> create_x_y_vectors(const std::vector<Point2D<T>>& point_vector)
{
VectorXY<T> xy_vec;
size_t vec_length = point_vector.size();
// Preallocate the vector size
xy_vec.x.resize(vec_length);
xy_vec.y.resize(vec_length);
for(size_t i = 0; i < vec_length; ++i){
xy_vec.x[i] = point_vector[i].x();
xy_vec.y[i] = point_vector[i].y();
}
return xy_vec;
}
Но когда я компилирую свое рабочее пространство, я получаю следующую ошибку:
неопределенная ссылка на `ASSplinePath :: Point2D :: create_x_y_vectors (std :: vector, std :: allocator>> const &)
Также в конец файла cpp включено следующее:
template class ASSplinePath::Point2D<float>;
template class ASSplinePath::Point2D<double>;
Здесь VectorXY - это структура, которая определена в другом файле заголовка. Поэтому я включил этот файл заголовка в файлы point2D.h и point2D.cpp.
После проверки нескольких ответов на stackoverflow и ошибки я сделал следующее:
template class std::vector<ASSplinePath::Point2D<double>>;
template class std::vector<ASSplinePath::Point2D<float>>;
Но это все равно не решило никаких проблем. Следовательно, я не понимаю, почему существует неопределенная ссылка на эту функцию в .so файле .
Я не знаю, что мне не хватает. Я буквально включил все файлы заголовков из библиотеки, чтобы проверить, работает ли это. Но этого не произошло. Извините, если это глупая ошибка.
Спасибо.
1 ответ
Вы неправильно написали определение функции, оно должно быть
template <typename T>
VectorXY<T> ASSplinePath::Point2D<T>::create_x_y_vectors(const std::vector<Point2D<T>>& point_vector)
{
...
}
В вашей версии определена глобальная функция, которая отличается от функции, объявленной в файле заголовка.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .