You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:02:10