typedef 中的模板实例化的范围是否有限
Does a template instantiation in typedef have limited scope?
模板类似于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:这与模板无关。
注 2:MyClassUser::begin(
后,编译器知道您正在编写MyClassUsuer
方法,并将MyClassUser
添加到搜索符号的本地范围。因此,您不再需要编写MyClassUser::
。
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 这个变量在 C++ 中的范围是什么?
- 堆栈变量超出范围时是否解除分配?
- C++ 中的引用范围是什么?
- PTRACE_TRACEME的范围是多少?
- 确定范围是访问虚拟功能的合法方式吗?
- C 中类声明的范围是什么?
- C 中静态声明的结构的范围是什么?
- 对象在超出范围时是否被销毁,因为它们已引发异常.C++
- Winsock中插座对象的范围是什么?
- 默认模板参数的范围是什么?
- 封闭环变量的生存期和范围是什么
- 从 boost::algorithm::join 返回值的范围是什么?
- 类模板中定义的朋友函数范围定义的范围是什么?
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 如何检测ptr在引用超出范围后是否仍在引用有效引用
- 尝试将引擎从SDL重写为SFML,sf::RenderWindow的范围是错误的
- 功能范围是什么意思
- 可视化 C++ 宏重定义的范围是什么
- 在 c++ 中定义的预编译器的范围是什么?