2017-09-22 1 views
0

아래 'DoesBlah'테스트의 기본 클래스에서 'MyType'을 사용하고 싶습니다.GTest Typed Test - 사용

#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를 사용하여 시도했지만 모두 작동하지 않았다.

Derived에서 'MyType'이라는 것을 인식하도록하려면 어떻게해야합니까?

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>에서 파생되는 템플릿 클래스의 멤버 함수 정의입니다 : 일부 단순화와

답변

1

는 매크로 TYPED_TEST(Derived, DoesBlah) 같은 뭔가로 확장됩니다. TestFixturetypedef을 사용할 수 있지만 템플릿 매개 변수 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