c++ - C++ 模板和参数化 Google 测试
问题描述
假设我正在为一个名为的类编写模板class_a
:
bool test_success;
template <uint32_t len>
class class_a
{
uint32_t do_something(void)
{
return len+1;
}
};
我想用一系列不同的len
值来测试这个类,所以我正在做一个参数化测试。
现在,在编写测试夹具时出现了问题:
class test_classa : public::testing::TestWithParam< uint32_t >
{
void SetUp() override
{
test_success = false;
// constexpr uint32_t a_len = GetParam(); //compiler error 1 (See below)
// const uint32_t a_len = GetParam(); //compiler error 2 (See below)
constexpr uint32_t a_len = 5; //Works! But that's not using the test parameter!
class_a<a_len> a_test;
if (a_test.do_something() == (a_len+1))
{
test_success = true;
}
}
void TearDown() override
{
}
};
我的其余代码如下:
TEST_P(test_classa, test_classa) {
EXPECT_EQ (test_success, true);
}
INSTANTIATE_TEST_SUITE_P(
class_a,
test_classa,
::testing::Values(
10,
20
));
那么有人可以帮助我如何完成这项工作吗?甚至可能吗?
编辑:
根据要求,这里是编译错误: (1) constexpr 变量 'a_len' 必须由常量表达式初始化 (2) 非类型模板参数不是常量表达式
解决方案
至少您错误地派生了该类。尝试推导
class test_classa : public testing::TestWithParam< uint32_t >
编辑
提供详细信息后,我看到您正在为 a 分配一个函数调用constexpr
,如果您的函数也是一个函数,这可能会起作用constexpr
,因为constexpr
已在编译时解析。我相信编译器消息包含类似的消息,例如“Function must be a constexpr
”。
对于第二种情况,我不太了解您的GetParam
函数的详细信息,并且由于您没有包含整个编译器消息,我相信,仔细阅读它会提示您在哪里找到要解决的问题。
如果到那时您还没有找到它,请更新问题并尝试在此处发布问题时提供尽可能多的信息。
编辑 2
现在我看到了第二个问题。它正在尝试使用const
变量实例化模板。这是不可能的,因为 的值const variable
是在运行时获取的,而模板是在编译期间实例化的。你不能做这样的事情。
推荐阅读
- maven - maven 编译器插件如何进入有效的 POM,即使它不在 Super POM 中
- angular - NgRX provideMockStore createSelector 状态未定义
- python - 你应该如何用python更新本身就是值的键的JSON值
- r - 如何在R中列值大于20的情况下按降序对数据框(mtcars)的列进行排序
- python - Python Django Ajax获取请求在def函数中不起作用
- visual-studio - 为什么在 VS 2019 中出现智能错误
- angular - 如果我删除 node_modules 文件夹会发生什么?
- python - 多处理:将值并行分配给 N 维数组/矩阵
- asp.net-core-webapi - asp net core web api自定义模型验证
- python - 避免数据标签相互交叉 Matplotlib Python