Boost参数化测试编译失败,求代码修正与结构优化方案
问题解决与代码优化
错误1:binary_search未声明
C++模板函数的定义必须在调用代码的可见范围内。当前binary_search模板仅在binary_search.cpp中定义,测试代码无法找到其声明。解决方法:
- 创建头文件
src/binary_search.h,将模板函数的声明与定义移入(模板函数通常需在头文件中实现,除非显式实例化特定类型) - 测试代码中包含该头文件
错误2:Boost参数化测试的类型绑定问题
input_arrs是二维C数组,Boost.Test的data::make处理这类数组时会出现类型推导错误(数组衰减导致类型不匹配)。改用std::vector存储测试数据可避免此问题,同时让代码更符合现代C++风格。
优化后的完整代码结构
1. 新增头文件 src/binary_search.h
#pragma once #include <cstdint> template <typename T> T binary_search(T A[], uint8_t len, T nu) { uint8_t low = 0; uint8_t high = len - 1; while (low <= high) { uint8_t mid = low + (high - low) / 2; if (nu == A[mid]) return mid; else if (nu > A[mid]) low = mid + 1; else high = mid - 1; } return -1; }
2. 修改 src/binary_search.cpp(可选)
若仅用头文件实现模板,可删除此文件;若需保留,可改为:
#include "binary_search.h" // 可选:显式实例化特定类型,例如 // template int32_t binary_search<int32_t>(int32_t[], uint8_t, int32_t);
3. 修改测试代码 test/test_binary_search.cpp
#include <boost/test/data/test_case.hpp> #include <boost/test/included/unit_test.hpp> #include <vector> // 包含模板函数的头文件 #include "../src/binary_search.h" #define BOOST_TEST_MODULE test_algorithms BOOST_AUTO_TEST_SUITE(test_search) // 改用std::vector存储测试数据,避免C数组的类型问题 std::vector<std::vector<int32_t>> input_arrs = { {26, 31, 41, 41, 58, 59, 101, 104}, {26, 31, 41, 41, 58, 59, 101, 104}, {1, 4, 5, 7, 19, 28, 45, 92}, {1, 4, 5, 7, 19, 28, 45, 92} }; std::vector<int32_t> input_vals = {31, 32, 92, 101}; std::vector<int32_t> expected_vals = {1, -1, 7, -1}; // 使用boost::unit_test::data::make处理vector,类型推导更准确 auto test_cases = boost::unit_test::data::make(input_arrs) ^ boost::unit_test::data::make(input_vals) ^ boost::unit_test::data::make(expected_vals); BOOST_DATA_TEST_CASE(test_binary_search, test_cases, input_arr, nu, exp) { // 将vector转换为数组指针传递给binary_search auto obs = binary_search(input_arr.data(), static_cast<uint8_t>(input_arr.size()), nu); BOOST_TEST(obs == exp); // 推荐用BOOST_TEST而非BOOST_ASSERT,提供更友好的测试输出 } BOOST_AUTO_TEST_SUITE_END()
4. 优化 test/CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(test_algorithms) # 使用target_compile_features设置C++标准,更符合CMake最佳实践 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 添加调试信息 add_compile_options(-g) # 包含src目录,让测试代码能找到binary_search.h include_directories(../src) find_package(Boost 1.87.0 REQUIRED COMPONENTS unit_test_framework) if (Boost_FOUND) enable_testing() add_executable(test_binary_search test_binary_search.cpp ../src/binary_search.cpp # 若保留cpp文件则添加,否则可移除 ) target_link_libraries(test_binary_search PRIVATE Boost::unit_test_framework) target_include_directories(test_binary_search PRIVATE ${Boost_INCLUDE_DIRS}) add_test(NAME test_binary_search COMMAND test_binary_search) endif()
编译与运行
重新执行编译命令:
cmake -S . -B build cmake --build build # 运行测试 cd build && ./test_binary_search
内容的提问来源于stack exchange,提问作者grahamhs
相关产品推荐
相关产品推荐

