typedef 中的模板实例化的范围是否有限

Does a template instantiation in typedef have limited scope?

本文关键字:范围是 是否 范围 实例化 typedef      更新时间:2023-10-16

模板类似于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 文件肯定包含在内。为什么?

可以在MyClass的另一个方法中使用PacketList::iterator。另外,如果我重复完整实例化也没有问题:

util::MyClass<eec::Packet*,20>::iterator MyClassUser::begin(){ ... }

可接受的解决方案应将"幻数"20的使用限制在单个位置。这怎么可能?

是的,类内部typedef是类的本地。因此,您应该写:

MyClassUser::PacketList::iterator MyClassUser::begin(){ ... }

注1:这与模板无关。

注 2MyClassUser::begin(后,编译器知道您正在编写MyClassUsuer方法,并将MyClassUser添加到搜索符号的本地范围。因此,您不再需要编写MyClassUser::