Как получить доступ к typedefs из унаследованного шаблона - PullRequest
0 голосов
/ 08 июня 2011

У меня есть следующий фрагмент кода:

template <typename T>
struct ChildStruct
{
  typedef std::map<int,T> Tmap;
};

struct DataStruct: public ChildStruct<long>
{

};

void Test()
{
  DataStruct::ChildStruct<long>::Tmap map;
}

Возможно ли получить доступ к Tmap typedef, расположенному в ChildStruct, из-за пределов DataStruct без определения типа этого ChildStruct внутри Datastruct?

Когда я использую упомянутый фрагмент кода в Visual Studio, все работает нормально, но linux / macos g ++ выдает ошибку:

error: 'ChildStruct' is not a member of 'DataStruct'

Я нашел способ, определив вспомогательный typedef внутри od DataStruct:

struct DataStruct: public ChildStruct<long>
{
    typedef ChildStruct<long> ChildStructLong;
};

void Test()
{
    DataStruct::ChildStructLong::Tmap map;
}

Но я бы предпочел путь без ChildStructLong определения.

Спасибо!

Отредактировано:

Решением является вызов ChildStruct непосредственно из-за пределов DataStruct, как предполагает Кристиан Рау. Иногда самое простое решение - лучшее решение; -)

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Используйте следующее:

typename Foo<double>::my_typedef blah;
1 голос
/ 08 июня 2011

Почему бы вам не использовать DataStruct::Tmap напрямую?

#include <map>

template <typename T>
struct A
{
  typedef std::map<int, T> map_type;
};

struct B : A<int>
{ };

int main()
{
  B::map_type x;
}

Посмотрите, как это работает здесь .

...