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

时间:2014-03-02 08:39:18

标签: c++ templates

模板类似于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的使用限制在单个位置。这怎么可能?

1 个答案:

答案 0 :(得分:2)

是的,类中的typedef是本地的。因此你应该写:

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

注1 :这与模板无关。

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