2017-09-22 6 views
0

Je souhaite utiliser 'MyType' de la classe de base dans le test 'DoesBlah' ci-dessous.GTest Test dactylographié - Utilisation de

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

Cependant, je reçois l'erreur de compilation suivante:

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; 

J'ai essayé d'utiliser TestFixture :: MyType, typename TestFixture :: MyType, mais les deux ne fonctionnent pas.

Comment obtenir que Derived reconnaisse qu'il y a quelque chose appelé 'MyType'?

Répondre

1

Avec quelques simplifications, la TYPED_TEST(Derived, DoesBlah) macro est à quelque chose comme:

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

Ainsi, le bloc {} qui suit est la définition de fonction pour un membre d'une classe de modèle qui dérive de Derived<TypeParam>. Le typedef pour TestFixture est disponible, mais il dépend du paramètre de modèle TypeParam, il est donc considéré comme un type dépendant. De plus, vous voulez accéder à un membre modèle de ce type dépendant. Donc, vous avez besoin à la fois les typename et template mots-clés:

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

Pour plus sur les types dépendants et en utilisant les typename et template mots-clés dans les déclarations et expressions, voir this SO question.

+0

Merci pour l'explication très détaillée! – Supervisor