我正在文件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!

在这里查看详细说明:
  • Where and why do I have to put the "template" and "typename" keywords?
  • 关于c++ - typedef错误: where to put typedef and how it should be written?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7757949/

    10-12 02:08