模板类似于STL包含的内容:
template <class T, int MAXSIZE>
class MyClass {
public:
class iterator : public std::iterator<std::input_iterator_tag,T> {
};
// constructors, destructor, methods...
};
客户端的.h文件定义了一个typedef和返回迭代器的方法:
class MyClassUser {
public:
typedef util::MyClass<eec::Packet*,20> PacketList;
//...
PacketList::iterator begin();
PacketList::iterator end();
};
客户端的.h文件包含方法begin:
的定义PacketList::iterator MyClassUser::begin(){ ... } // flagged by the compiler
MyClassUser::PacketList::iterator MyClassUser::end(){ ... } // OK - according to answer
但是这被标记为‘PacketList’ has not been declared
,尽管.h文件肯定包括在内。为什么呢?
使用PacketList::iterator
可能在 MyClass的另一个方法中。此外,如果我重复完整的实例化,也没有问题:
util::MyClass<eec::Packet*,20>::iterator MyClassUser::begin(){ ... }
可接受的解决方案应该将“幻数”20的使用限制在单个位置。这怎么可能?
答案 0 :(得分:2)
是的,类中的typedef
是本地的。因此你应该写:
MyClassUser::PacketList::iterator MyClassUser::begin(){ ... }
注1 :这与模板无关。
注意2 :MyClassUser::begin(
之后,编译器知道您正在编写MyClassUsuer
方法并将MyClassUser
添加到搜索符号的本地范围。因此,您不再需要编写MyClassUser::
。