2017-09-22 1 views
0

Ich möchte 'MyType' aus der Basisklasse in der 'DoesBlah' Test unten verwenden.GTest typisierte Test - mit

#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); 
} 

Allerdings bekomme ich folgende Kompilierungsfehler:

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; 

Ich versuchte TestFixture :: MyType verwenden, Type-Name TestFixture :: MyType, aber beide nicht funktioniert.

Wie kann ich Derived erkennen, dass es etwas namens "MyType" gibt?

Antwort

1

Bei einigen Vereinfachungen dehnt sich das Makro TYPED_TEST(Derived, DoesBlah) zu so etwas wie:

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() 

So ist der {} Block, der für ein Mitglied einer Template-Klasse ist die Definition der Funktion folgt, die von Derived<TypeParam> ableitet. Die typedef für TestFixture ist verfügbar, aber sie hängt vom Vorlagenparameter TypeParam ab, daher wird sie als abhängiger Typ betrachtet. Darüber hinaus möchten Sie auf ein Vorlagenelement dieses abhängigen Typs zugreifen. Sie müssen also sowohl die typename und template Schlüsselwörter:

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

Für mehr über abhängige Arten und unter Verwendung der typename und template Schlüsselwörter in Erklärungen und Ausdrücken finden this SO question.

+0

Vielen Dank für die sehr detaillierte Erklärung! – Supervisor

Verwandte Themen