我正在文件btree.h中编写btree实现类'btree',并在btree.tem中实现,并在文件btree_iterator.tem中实现的文件btree_iterator.h中使用外部迭代器类'btree_iterator'
这是btree.h的内容(精简):
#include "btree_iterator.h"
template <typename T> class btree
{
public:
friend class btree_iterator<T>;
typedef btree_iterator<T> iterator;
iterator find(const T& elem);
};
#include "btree.tem"
现在,在执行find函数时,我在btree.tem中具有以下存根实现:
template <typename T> iterator btree<T>::find(const T& elem) //LINE 24
{
return NULL;
}
(我只包含与我的问题相关的代码行)
编译时出现以下错误:
btree.tem:24: error: expected constructor, destructor, or type conversion before 'btree'
现在,我知道这与以下事实有关:我已经在类声明中声明了用于迭代器的typedef,因此仅在该块内进行作用域设置。但是我试图在btree.tem中放置另一行typedef,但它根本无法工作。
应该怎么写?
最佳答案
这样写:
template <typename T>
typename btree<T>::iterator btree<T>::find(const T& elem) //LINE 24
{
//;;
}
由于
iterator
是嵌套类型,因此您必须编写btree<T>::iterator
,并且由于它是依赖的嵌套类型,因为它取决于模板参数类型T
,因此还必须使用typename
: typename btree<T>::iterator
//^^^^^^^^ must use it as iterator is a dependent type!
在这里查看详细说明:
关于c++ - typedef错误: where to put typedef and how it should be written?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7757949/