如何从继承的模板访问typedef

时间:2011-06-07 20:36:16

标签: c++ templates g++

我有以下代码段:

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

struct DataStruct: public ChildStruct<long>
{

};

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

可以从DataStruct外部访问位于ChildStruct中的Tmap typedef而无需在Datastruct中对此ChildStruct进行类型定义吗?

当我在Visual Studio中使用提到的代码片段时,一切正常,但是linux / macos g ++给了我错误:

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

我通过在od DataStruct中定义一个帮助器typedef找到了一种方法:

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

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

但是我会在没有 ChildStructLong 定义的情况下采取行动。

谢谢!

编辑:

解决方案是直接从DataStruct外部调用ChildStruct,作为Christian Rau的建议。有时最简单的解决方案是最佳解决方案; - )

2 个答案:

答案 0 :(得分:3)

使用以下内容:

typename Foo<double>::my_typedef blah;

答案 1 :(得分:1)

为什么不直接使用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;
}

看到它正常工作here