typedef错误:在哪里放入typedef以及应该如何编写?

时间:2011-10-13 17:24:13

标签: c++ iterator compiler-errors typedef

我正在btree.h文件中编写一个btree实现类'btree',并在文件btree_iterator.tem中实现的文件btree_iterator.h中使用外部迭代器类'btree_iterator'在btree.tem中实现

这是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'

现在我知道这与我在类声明中声明了iterator的typedef这一事实有关,因此仅限于该块内部。但我试图在btree.tem中添加另一行typedef,但它只是不起作用。

应该怎么写?

4 个答案:

答案 0 :(得分:3)

写下这个:

template <typename T>
typename btree<T>::iterator btree<T>::find(const T& elem) //LINE 24
{
  //;;
}

由于iterator是嵌套类型,因此您需要编写btree<T>::iterator,因为它是依赖嵌套类型,因为它取决于模板参数类型{{ 1}},你也要使用T

typename

请在此处查看详细说明:

答案 1 :(得分:3)

您的返回类型已损坏(全局范围内没有iterator!),您需要使用typename限定依赖类型:

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

答案 2 :(得分:1)

iteratorbtree<T>中的嵌套类型。定义函数时,您不在类的范围内,因此您需要将类型限定为typename btree<T>::iterator

答案 3 :(得分:1)

成员函数定义中的查找范围略有不对称。返回类型的查找在封闭范围内执行,而在类范围中查找参数。这意味着虽然对于参数,您可以使用typedef的非限定名称,但不能对返回类型执行此操作。举个例子:

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

返回类型[1]位于封闭的命名空间范围内,并且在该范围内integer未定义,因此您需要对其进行限定。另一方面,在类范围内查找成员函数的参数,因此可以在那里使用不合格的integer

在您的特定情况下,由于您使用的是模板,因此必须在依赖名称之前添加typename,这增加了复杂性。但问题的重要部分是在封闭范围内执行返回类型的查找。