说我有这个(卡在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>::Iterator
和FooMap<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)。
不过似乎有点黑。
有什么想法吗?
答案 0 :(得分:2)
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;
}
答案 1 :(得分:1)
使用
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;