Typedef错误:把Typedef放在哪里,应该怎么写
typedef error: where to put typedef and how it should be written?
我正在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!
请看这里的详细说明:
- 在哪里以及为什么我必须把"模板"answers";typename"关键字?
返回类型坏了(全局作用域中没有iterator
!),您需要用typename
来限定依赖类型:
template <typename T>
typename btree<T>::iterator btree<T>::find(const T& elem)
{
return NULL;
}
iterator
是btree<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
,这增加了复杂性。但是问题的重要部分是,对返回类型的查找是在封闭作用域中执行的。
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 模板参数在 C++ 中存储在哪里?
- 我的重复检查代码中的错误究竟在哪里?
- 在哪里可以找到 std::bitset 的数据成员?
- 在哪里保存typedef的,我应该重复typedef的