- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <gtest/gtest.h>
template<typename T, size_t N>
size_t getSize(T (&arr)[N]){
return N;
}
template<int N>
struct ArrayParam {
static const int _length = N;
int _arr[N];
};
ArrayParam<3> ap1 = {{1,2,3}};
//ArrayParam<4> ap2 = {{1,2,3,4}};
class ParamTest: public ::testing::TestWithParam<ArrayParam<3>>{};
TEST_P(ParamTest, SizeTest){
ArrayParam<3> param = GetParam();
printf("\nparam._length == %d\n",param._length); //OK
printf("\nValue2 == %d\n",ArrayParam<3>::_length); //OK
//EXPECT_EQ(param._length,getSize(param._arr)); //NOT OK
//EXPECT_EQ(3,param._length); // NOT OK
EXPECT_EQ(3,sizeof(param._arr)/sizeof(int)); //OK
}
INSTANTIATE_TEST_CASE_P(ArraySize,ParamTest,testing::Values(ap1));
有人知道为什么当我尝试访问 _length
时 EXPECT_EQ 不能作为 printf 工作吗? ?
我的最终目标是为各种 ArrayParam<T>
编写单个测试实例对象,例如 ArrayParam<4> ap2
, ArrayParam<5> ap3
, 等等。
我得到的错误:
~/tests.cpp.o: 在函数中ParamTest_SizeTest_Test::TestBody()': ~/tests.cpp: undefined reference to
ArrayParam<3>::_length' collect2: error: ld 返回 1 退出状态
最佳答案
一般来说,C++中的静态数据成员需要在类外定义,像这样:
struct A {
static int myInt;
};
A::myInt; //doesn't even have to be initialized
Const和non-volatile成员比较特殊,可见in the reference .它们可以用类主体中的任何常量表达式进行初始化:
struct A {
static const int myInt = 1;
};
int main() {
std::cout << A::myInt;
}
但是,这条规则有一个异常(exception)(来自 cppreference 中的同一段,强调我的):
If a const [non-inline (since C++17)] static data member [or a constexpr static data member (since C++11)] is odr-used, a definition at namespace scope is still required, but it cannot have an initializer. This definition is deprecated for constexpr data members (since C++17).
odr-used 是这样解释的(强调我的):
Informally, an object is odr-used if its value is read (unless it is a compile time constant) or written, its address is taken, or a reference is bound to it; a reference is odr-used if it is used and its referent is not known at compile time; and a function is odr-used if a function call to it is made or its address is taken. If an object, a reference or a function is odr-used, its definition must exist somewhere in the program; a violation of that is usually a link-time error.
这正是这里发生的事情。 EXPECT_EQ
通过 const T&
获取参数,即绑定(bind)一个引用到这个类型。由于引用绑定(bind)到 _length
,它使其成为 odr-used
并且需要类外成员定义。
odr-used
异常不适用于 printf
,因为 printf
(作为 C 函数)不采用引用。它属于定义的“读取(除非它是编译时常量)”部分。由于我们有一个编译时间常量,所以一切正常。
如果您使用的是 C++17,只需将 const
更改为 constexpr
即可:
template<int N>
struct ArrayParam<N> {
static constexpr int _length = N;
int _arr[N];
};
C++17 标准为命名空间范围内的 constexpr static
成员定义已弃用(你不仅不必使用它,实际上你不应该使用它)。
如果您不使用 C++17,则必须在与该类相同的命名空间中添加此数据成员的定义:
template<int N>
struct ArrayParam<N> {
static constexpr int _length = N; //const is fine as well
int _arr[N];
};
template<int N>
constexpr int ArrayParam<N>::_length;
这将允许您将它与 GoogleTest 的 EXPECT_EQ
作为旁注,我想推荐再次使用 std::array
。它更具可读性,更容易被所有 C++ 程序员识别。
作为大多数标准容器,它是高效的,并且由经验丰富的人编写得很好。在您之前使用它的无数程序员已经过测试并证明它很好。
关于c++ - GTest 的 EXPECT_EQ 给出未定义的错误引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52205340/
我正在使用谷歌测试功能 EXPECT_EQ运行函数的测试用例。功能,find返回 list并接受要查找的名称字符串。这是我的测试函数: TEST_F(test_neighborhood, find)
我正在使用谷歌测试函数 EXPECT_EQ 来运行函数的测试用例。函数“find”返回一个列表并接受要查找的名称的字符串。这是我的测试函数: TEST_F(test_neighborhood, fin
我正在学习数据结构,所以我通过模板制作了一个 Stack 类并使用 gtest 对其进行了测试。 虽然在使用 EXPECT_EQ 宏的 2 种方式中它显示不同的测试结果。 这样,最后一行仅在我使用“R
我想测试一个返回一些用户定义类型值的函数。我知道我可以使用 EXPECT_EQ、EXPECT_FLOAT_EQ 等测试基本的 int、float、double 等,但不能测试用户定义的类型。有什么线索
我正在使用 gtest,但我是 gtest 的新手。我想对复杂数据结构的两个 std::vector 中的值进行比较。我想做这样的事情: ASSERT_EQ(a.size(), b.size());
#include template size_t getSize(T (&arr)[N]){ return N; } template struct ArrayParam { static c
我有一个 boost 递归变体,如下所示。当我使用断言比较两个递归变体对象时,它工作正常但使用 EXPECT_EQ 时,它给出编译错误。 typedef boost::make_recursive_v
假设我有这个测试用例: TEST_F(TestCase1, HappyCase){ foo->doSomething(arg1, new inlineCallback([=](bool suc
在我的测试中,我针对某些字符(如“a”、“b”等)在字符上设置了 EXPECT_EQ()...到目前为止一切顺利。 现在我应该针对不可打印的 ASCII 字符 (0xFE) 进行测试。我的角色被定义为
我无法理解为什么在对双数或 float 求和的情况下测试用例会失败。它适用于整数数据类型。 //simple_method.h中的方法 double sum ( double a, double b)
我无法编译以下代码的最后一行: typedef boost::variant, std::vector> Container; std::vector v1; v1.push_back("sd");
我是一名优秀的程序员,十分优秀!