在 GTEST (Googletest) 中使用模板
Use Template in GTEST (Googletest)
我知道。标题并不完美。也许我以后会资助一个更好的头条新闻。
我对模板的 GTEST 有疑问。
(是的,我知道。代码没有意义。它是一个示例)。
我有以下模板:
template<typename T>
struct MY_VALUE{};
template<>
struct MY_VALUE<uint8_t>{
static const uint8_t val = 8;
};
template<>
struct MY_VALUE<uint16_t>{
static const uint16_t val = 16;
};
我可以用(测试成功)测试代码:
TEST(MY_VALUE_test, test) {
uint32_t var8 = MY_VALUE<uint8_t>::val;
ASSERT_EQ(8, var8);
uint32_t var16 = MY_VALUE<uint16_t>::val;
ASSERT_EQ(16, var16);
}
但是当我尝试对此进行测试时,LINKER 给我一个错误:
TEST(MY_VALUE_test, test1) {
ASSERT_EQ(8, MY_VALUE<uint8_t>::val);
ASSERT_EQ(16, MY_VALUE<uint16_t>::val);
}
链接器错误:
undefined reference to `MY_VALUE<unsigned char>::val
undefined reference to `MY_VALUE<unsigned short>::val
任何人的想法:)
谢谢
问题在于 GTEST 的断言引擎需要引用。要有参考 - 需要定义变量:
template<>
struct MY_VALUE<uint8_t>{
static const uint8_t val = 8;
};
// this line is missing
// Note: do not put it in header - if you have multiple files project
const uint8_t MY_VALUE<uint8_t>::val;
对 uint16_t 执行相同的操作。
如果您有支持 C++17 的编译器 - 您可以尝试将 inline 或 constexpr 添加到 val:
template<>
struct MY_VALUE<uint8_t>{
static constexpr uint8_t val = 8;
};
谢谢,你的回答很有帮助。
添加:
const uint8_t MY_VALUE<uint8_t>::val;
有效。
我没有 c++17 支持。
我不能尝试这个。
我知道。标题并不完美。也许我以后会资助一个更好的头条新闻。 我对模板的 GTEST 有疑问。 (是的,我知道。代码没有意义。它是一个示例)。 我有以下模板:
template<typename T>
struct MY_VALUE{};
template<>
struct MY_VALUE<uint8_t>{
static const uint8_t val = 8;
};
template<>
struct MY_VALUE<uint16_t>{
static const uint16_t val = 16;
};
我可以用(测试成功)测试代码:
TEST(MY_VALUE_test, test) {
uint32_t var8 = MY_VALUE<uint8_t>::val;
ASSERT_EQ(8, var8);
uint32_t var16 = MY_VALUE<uint16_t>::val;
ASSERT_EQ(16, var16);
}
但是当我尝试对此进行测试时,LINKER 给我一个错误:
TEST(MY_VALUE_test, test1) {
ASSERT_EQ(8, MY_VALUE<uint8_t>::val);
ASSERT_EQ(16, MY_VALUE<uint16_t>::val);
}
链接器错误:
undefined reference to `MY_VALUE<unsigned char>::val
undefined reference to `MY_VALUE<unsigned short>::val
任何人的想法:) 谢谢
问题在于 GTEST 的断言引擎需要引用。要有参考 - 需要定义变量:
template<>
struct MY_VALUE<uint8_t>{
static const uint8_t val = 8;
};
// this line is missing
// Note: do not put it in header - if you have multiple files project
const uint8_t MY_VALUE<uint8_t>::val;
对 uint16_t 执行相同的操作。
如果您有支持 C++17 的编译器 - 您可以尝试将 inline 或 constexpr 添加到 val:
template<>
struct MY_VALUE<uint8_t>{
static constexpr uint8_t val = 8;
};
谢谢,你的回答很有帮助。 添加:
const uint8_t MY_VALUE<uint8_t>::val;
有效。 我没有 c++17 支持。 我不能尝试这个。