参数化 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>::Iterator
和 FooMap<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;
}
说我有这个(坚持使用 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;
我得到 "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;
}