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

说我有这个(卡在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)。

不过似乎有点黑。

有什么想法吗?

shimin_2222 回答:别名化(或类型定义)参数化类的内部类

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

On GodBolt

,

使用

message: error.details ? error.details[0].message : "Some error message"/error 

编译器抱怨未声明T(可能还有S),我必须同意。
如果要保持T抽象,则必须使用参数化模板。

但是我认为您实际上想为T = Foo和S = 5的特定情况键入一个“ short”。
可以通过这种方式完成

typedef FooMap<T,S>::Iterator FooIterator;
本文链接:https://www.f2er.com/3165424.html

大家都在问