我正在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,但它只是不起作用。
应该怎么写?
答案 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)
iterator
是btree<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
,这增加了复杂性。但问题的重要部分是在封闭范围内执行返回类型的查找。