Typedef错误:把Typedef放在哪里,应该怎么写



我正在btree.h文件中编写一个b树实现类'btree',并在btree中实现。在文件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中再加一行类型定义。但这行不通。

应该怎么写?

写下:

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!

请看这里的详细说明:

  • 在哪里以及为什么我必须把"模板"one_answers";typename"关键字?

返回类型坏了(全局作用域中没有iterator !),您需要用typename来限定依赖类型:

template <typename T>
typename btree<T>::iterator btree<T>::find(const T& elem)
{
    return NULL;
}

iteratorbtree<T>的嵌套类型。当您定义函数时,您处于类的作用域之外,因此您需要将类型限定为typename btree<T>::iterator

成员函数定义中的查找范围有点不对称。返回类型的查找是在封闭范围内执行的,而参数是在类范围内查找的。这意味着,虽然可以对参数使用typedef的非限定名,但不能对返回类型这样做。对于一个说明性示例:

struct test {
   typedef int integer;
   integer f( integer x );
};
// [1]                   [2]
test::integer test::f( integer x ) {
   return x;
}

返回类型[1]位于封闭的名称空间作用域中,并且在该作用域中没有定义integer,因此需要对其进行限定。另一方面,成员函数的参数是在类作用域中查找的,因此可以在那里使用不限定的integer

在您的特殊情况下,由于您使用的是模板,因此必须在从属名称之前添加typename,这增加了复杂性。但是问题的重要部分是,对返回类型的查找是在封闭作用域中执行的。

最新更新