したがって、point2D.h ヘッダー ファイルに次の関数があります。
VectorXY<T> ASSplinePath::Point2D<T>::create_x_y_vectors(const std::vector<Point2D<T>>& point_vector)
次に、point2D.cpp ファイルで、この関数を次のように使用します。
template <typename T>
VectorXY<T> ASSplinePath::Point2D<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;
}
また、cpp ファイルの末尾には次のものが含まれています。
template class ASSplinePath::Point2D<float>;
template class ASSplinePath::Point2D<double>;
ここで、VectorXY は、別のヘッダー ファイルで定義されている構造体です。したがって、このヘッダー ファイルを point2D.h ファイルと point2D.cpp ファイルの両方に含めました。
template <typename T> struct VectorXY {
std::vector<T> x;
std::vector<T> y;
};
ここで、point_vector は別のポイント クラスから取得されます。
この関数をテストするために、catch2 と BDD スタイルで次のテストを作成しました。
SCENARIO("Creating x and y vectors from a vector of Point2D")
{
GIVEN("A Vector of Point2D<double> object")
{
std::vector<Point2D<double>> points;
Point2D<double> point_1(1.0, 2.0);
Point2D<double> point_2(-3.0, 4.0);
Point2D<double> point_3(5.0, -6.0);
points.push_back(point_1);
points.push_back(point_2);
points.push_back(point_3);
VectorXY<double> xy_vec;
WHEN("Creating x and y vectors")
{
xy_vec.create_x_y_vectors(points);
THEN("x and y vector should be returned")
{
REQUIRE(xy_vec.x == Approx(1.0, -3.0, 5.0));
REQUIRE(xy_vec.y == Approx(2.0, 4.0, -6.0));
}
}
}
}
しかし、これをコンパイルすると、次のエラーが発生します。
エラー: 'struct ASSplinePath::VectorXY' には 'create_x_y_vectors' という名前のメンバーがありません xy_vec.create_x_y_vectors(points);
エラー: 'Catch::Detail::Approx::Approx(double, double, double)' の呼び出しに一致する関数がありません REQUIRE(xy_vec.x ==approx(1.0, -3.0, 5.0));
追加する必要があります。このテストをコメントアウトすると、すべてがうまくコンパイルされます。したがって、ここで何かが間違っていると思います。したがって、このエラーが何を意味するのかよくわかりません。よろしくお願いします。ありがとうございました。