2017-09-22 119 views
0

我想在下面的'DoesBlah'测试中使用基类中的'MyType'。GTest输入测试 - 使用

#include <gtest/gtest.h> 

template <typename T> 
struct MemberVariable 
{ 
    T m_t; 
}; 

struct Base : public ::testing::Test 
{ 
    template <typename MemberType> 
    using MyType = MemberVariable<MemberType>; 
}; 

template <typename DerivedType> 
struct Derived : public Base 
{ 
}; 

typedef ::testing::Types<int, char> MyTypes; 
TYPED_TEST_CASE(Derived, MyTypes); 

TYPED_TEST(Derived, DoesBlah) 
{ 
    MyType<TypeParam> test; 
    test.m_t = (TypeParam)1; 
    ASSERT_EQ(test.m_t, 1); 
} 

不过,我得到以下编译错误:

gti/specific/level/Test.t.cpp: In member function 'virtual void Derived_DoesBlah_Test<gtest_TypeParam_>::TestBody()': 
gti/specific/level/Test.t.cpp:25:5: error: 'MyType' was not declared in this scope 
    MyType<TypeParam> test; 

我尝试使用的TestFixture :: MyType的,类型名的TestFixture :: MyType的,但都没有奏效。

我该如何获得认识到有一种叫做'MyType'的东西?

回答

1

有了一些简化,宏TYPED_TEST(Derived, DoesBlah)扩展为类似:

template <typename TypeParam> 
class Derived_DoesBlah_Test : public Derived<TypeParam> 
{ 
private: 
    typedef Derived<TypeParam> TestFixture; 
    virtual void TestBody(); 
}; 
template <typename TypeParam> 
void Derived_DoesBlah_Test<TypeParam>::TestBody() 

所以后面的{}块是一个模板类,从派生Derived<TypeParam>的成员函数定义。 typedef对于TestFixture是可用的,但它取决于模板参数TypeParam,因此它被视为依赖类型。更重要的是,你想访问该依赖类型的模板成员。所以,你既需要typenametemplate关键字:

{ 
    typename TestFixture::template MyType<TypeParam> test; 
    test.m_t = (TypeParam)1; 
    ASSERT_EQ(test.m_t, 1); 
} 

有关依赖类型更多,使用声明和表达式的typenametemplate关键字,看到this SO question

+0

谢谢你的非常详细的解释! – Supervisor