2016-06-23 40 views
1
template <typename T> class ClassA : public ::testing::Test { 
public: 
    ClassA() {} 

    constexpr static uint ZERO = 0; 
}; 

typedef ::testing::Types<ClassB, ClassC, ClassD> ParamTypes; 
TYPED_TEST_CASE(ClassA, ParamTypes); 

template <> constexpr uint ClassA<test::ClassB>::ZERO; 
template <> constexpr uint ClassA<test::ClassC>::ZERO; 
template <> constexpr uint ClassA<test::ClassD>::ZERO; 

TYPED_TEST(ClassA, testSomething) { ASSERT_EQ(ClassA::ZERO, 0); } ?? 
TYPED_TEST(ClassA, testSomething) { ASSERT_EQ(this->ZERO, 0); } ?? 

在谷歌測試中使用靜態constexpr內部打字測試的正確方法是什麼?在gtest打字測試中使用靜態constexpr

+0

我想你介紹的這兩種形式都是合法的... –

+0

@ W.F。他們不工作 – Lorac

+0

我以爲你會問是否可以通過'this->'來訪問靜態constexpr。我的猜測是,它不工作,因爲你傳遞給測試不完整的模板...''ClassA'是模板化的,因此它應該被專門化爲一個完整的類型...... –

回答

2

在這些場景中,我總是會使用constexpr函數獲得更多成功 - 無需提供單獨的定義。

此外,修正了幾個錯別字:

template <typename T> class ClassA : public ::testing::Test { 
public: 
    ClassA() {} 

    constexpr static uint ZERO() { return 0; } 
}; 

struct ClassB {}; 
struct ClassC {}; 
struct ClassD {}; 


typedef ::testing::Types<ClassB, ClassC, ClassD> ParamTypes; 
TYPED_TEST_CASE(ClassA, ParamTypes); 


TYPED_TEST(ClassA, testSomething) { ASSERT_EQ(ClassA<TypeParam>::ZERO(), 0); } 
TYPED_TEST(ClassA, testSomethingElse) { ASSERT_EQ(this->ZERO(), 0); }