在 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 支持。 我不能尝试这个。