2011-10-13 44 views
0

我正在写一个文件btree.h内的B树实现类“B树”和内部btree.tem在文件btree_iterator.h外部迭代器类“btree_iterator”在文件btree_iterator.tem实现实现typedef错误:在哪里把typedef和它应该如何写?

这里是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" 

现在在执行查找功能,我在btree.tem以下存根实现:

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

(我只过包含行的码S是相关的我的问题)

我编译时得到以下错误:

btree.tem:24: error: expected constructor, destructor, or type conversion before 'btree' 

现在我知道,这事做的事实,我已经宣布的typedef迭代器在类声明中,因此只在该块内部有作用域。但我试图在btree.tem中放入另一行typedef,但它不起作用。

应该怎么写?

回答

3

这样写:

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! 

在这里看到一个详细的解释:

+0

为什么你要重新编辑你的语法错误? :( –

+0

谢谢你!我不知道你必须再次使用typename,但它是有意义的 – Arvin

+0

@ TomalakGeret'kal:因为''你不是一个语法错误 – Nawaz

1

iteratorbtree<T>内的嵌套类型。当您定义该功能时,您不在该课程的范围内,因此您需要将该类型限定为typename btree<T>::iterator

+0

我已经改变了功能定义 模板 B树:迭代B树 ::找到(常量T&ELEM){//东西} 但它仍然给了我同样的错误? – Arvin

+1

@Arvin:'iterator'是一个依赖类型,所以它仍然需要'typename'。我刚刚编辑了我的答案。 –

+0

*当您定义函数时,您不在类范围之内*:仅对于返回类型,参数查找将在类范围内执行。 –

3

你的返回类型坏了(有一个在全球范围内没有iterator!),你会需要用typename资格的依赖型:

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

谢谢!现在错误消失了! – Arvin

+0

@阿文:没问题:) –

1

查找成员函数定义中的作用域稍微不对称。查找返回类型是在封闭范围内执行的,而参数是在类范围内查找的。这意味着虽然对于参数可以使用typedef的非限定名称,但不能为返回类型执行此操作。对于ilustrative例如:

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

返回类型[1]是在封闭命名空间范围,在这范围integer没有被定义,所以你需要限定它。另一方面,成员函数的参数在类范围内查找,因此您可以在那里使用不合格的integer

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

+0

感谢您进一步解释,我现在明白了! :) – Arvin