参数化 class 的内部 class 的别名(或类型定义)

Aliasing (or typedef'ing) inner class of parameterized class

说我有这个(坚持使用 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;

我得到 "error: ‘T’ was not declared in this scope"。如果我尝试在其上放置模板参数:

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

我得到 "error: expected unqualified-id before ‘template’"。
我求助于使用#define:

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

这似乎有效(尽管在 Online C++ Compiler 上无效)。

虽然看起来有点老套。

有什么想法吗?

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

编译器抱怨 T(可能还有 S)没有被声明——我必须同意。
如果你想保持 T 抽象,那么你就只能使用参数化模板。

但我认为您实际上想为 T=Foo 和 S=5 的特定情况键入 "short"。
可以这样做

/* ... start of your file */
class Foo {};
typedef FooMap<Foo,5>::Iterator FooIterator;
int main()
{
}

C++11 有 `using for this :)

当我尝试使用 C++03 时,我收到错误消息“need typename before FiniteMap as it is a dependent scope...

因此:

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;
}

On GodBolt