2017-09-22 11 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」と呼ばれるものがあることを認識させるにはどうすればよいですか?いくつかの単純化して

答えて

1

、マクロTYPED_TEST(Derived, DoesBlah)は次のように展開されます:だから次の{}ブロックはDerived<TypeParam>から派生テンプレートクラスのメンバーのための関数定義である

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

TestFixturetypedefが利用可能ですが、テンプレートパラメータTypeParamに依存するため、依存型とみなされます。さらに、依存型のテンプレートメンバーにアクセスする必要があります。 this SO questionを参照して、

依存型の詳細については
{ 
    typename TestFixture::template MyType<TypeParam> test; 
    test.m_t = (TypeParam)1; 
    ASSERT_EQ(test.m_t, 1); 
} 

と宣言や表現でtypenametemplateキーワードを使用して:あなたはtypenametemplateキーワードの両方を必要としています。

+0

非常に詳しい説明をありがとうございます! – Supervisor