结构问题和 catch2 测试
Problems with Structs and tests with catch2
所以我在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来自不同的点class。
为了测试此功能,我使用 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));
}
}
}
}
但是当我编译这个时,我得到以下错误:
error: 'struct ASSplinePath::VectorXY' 没有名为 'create_x_y_vectors' 的成员
xy_vec.create_x_y_vectors(分);
error: 没有匹配函数来调用‘Catch::Detail::Approx::Approx(double, double, double)’
要求(xy_vec.x == 大约(1.0,-3.0,5.0));
我应该补充一点,当我注释掉这个测试时,一切都会编译好。因此,我认为这里有问题。
因此,我不太确定此错误的含义。我将衷心感谢您的帮助。
谢谢。
所以我终于弄清楚问题出在哪里了。如果有人遇到类似类型的问题,请确保该函数是在结构中声明的,还是在其他 class 中声明的。在我的情况下,以下工作:
xy_vec = Point2D<double>().create_x_y_vectors(points);
create_x_y_vectors() 是在 Point2D class 中定义的,因此有必要制作一个 Point2D 对象。
所以我在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来自不同的点class。
为了测试此功能,我使用 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));
}
}
}
}
但是当我编译这个时,我得到以下错误:
error: 'struct ASSplinePath::VectorXY' 没有名为 'create_x_y_vectors' 的成员 xy_vec.create_x_y_vectors(分);
error: 没有匹配函数来调用‘Catch::Detail::Approx::Approx(double, double, double)’ 要求(xy_vec.x == 大约(1.0,-3.0,5.0));
我应该补充一点,当我注释掉这个测试时,一切都会编译好。因此,我认为这里有问题。 因此,我不太确定此错误的含义。我将衷心感谢您的帮助。 谢谢。
所以我终于弄清楚问题出在哪里了。如果有人遇到类似类型的问题,请确保该函数是在结构中声明的,还是在其他 class 中声明的。在我的情况下,以下工作:
xy_vec = Point2D<double>().create_x_y_vectors(points);
create_x_y_vectors() 是在 Point2D class 中定义的,因此有必要制作一个 Point2D 对象。