如何从继承的模板访问typedefs

How to access typedefs from inherited template

本文关键字:访问 typedefs 继承      更新时间:2023-10-16

我有以下代码片段:

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进行typedef?

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

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

我找到了一种方法,在odDatastruct:中定义了一个helper typedef

struct DataStruct: public ChildStruct<long>
{
    typedef ChildStruct<long> ChildStructLong;
};
void Test()
{
    DataStruct::ChildStructLong::Tmap map;
}

但我倾向于在没有ChildStructLong定义的情况下使用。

谢谢!

编辑:

解决方案是直接从DataStruct外部调用ChildStruct,正如Christian Rau所建议的那样。有时,最简单的解决方案就是最好的解决方案;-)

使用以下内容:

typename Foo<double>::my_typedef blah;

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

看到它在这里工作。