首页 > 解决方案 > 参数化类的别名(或类型定义)内部类

问题描述

假设我有这个(卡在 C++03 中)。

template <class T, int S>
class FiniteMap
{
public:
    class Iterator {};
    class Entry {};
};

class Foo {};

template <class T, int S>
class FooMap : public FiniteMap<T,S>
{
public:
    void bar()
    {
        FooMap<T,S>::Iterator iter;
        FooMap<T,S>::Entry    entry;
    }
};

int main()
{
    return 0;
}

我想typedef FooMap<T,S>::IteratorFooMap<T,S>::Entry但如果我尝试这个:

typedef FooMap<T,S>::Iterator FooIterator;

我得到“错误:'T'没有在这个范围内声明”。如果我尝试在其上放置模板参数:

typedef
    template <class T, int S>
    FooMap<T,S>::Iterator FooIterator;

我得到“错误:'模板'之前的预期不合格ID”。
我已经使用#define:

#define FooIterator typename FooMap<T,S>::Iterator

这似乎有效(尽管它不适用于Online C++ Compiler)。

不过,这似乎有点骇人听闻。

有任何想法吗?

标签: c++templatestypedefinner-classes

解决方案


C ++ 11 有`用于这个:)

当我在 C++03 上尝试时,我收到错误“typename之前需要,FiniteMap因为它是一个依赖范围......

因此:

template <class T, int S>
class FiniteMap {
public:
    class Iterator {};
    class Entry {};
};

class Foo {};

template <class T, int S>
class FooMap : public FiniteMap<T, S> {
public:
    typedef typename FiniteMap<T, S>::Iterator FooIterator;
    typedef typename FiniteMap<T, S>::Entry FooEntry;

    void bar()
    {
        FooIterator iter;
        FooEntry    entry;
    }
};

int main()
{
    FooMap<int, 3> test;

    return 0;
}

在上帝螺栓上


推荐阅读