在使用模板时无效地使用非静态数据成员
Invalid use of non-static data member while using templates
我剪了下面的代码,它实现了一个带有模板的二叉搜索树:
#include<iostream>
using namespace std;
template<typename T>
class Node{
public:
T data;
Node<T> *left;
Node<T> *right;
Node<T> *parent;
Node(T input_data=NULL){
data=input_data;
left=NULL;
right=NULL;
parent =NULL;
}
};
template<typename T>
class BinarySearchTree{
private:
long n;
Node<T> *root;
public:
BinarySearchTree(Node<T> *input_root=NULL, long input_size=0){
n=input_size;
root=input_root;
}
void insert(Node<T> *p=root, T data){
Node<T> *par=NULL;
while(p!=NULL){
par=p;
if(data <= p->data)
p=p->left;
else
p=p->right;
}
Node<T> *z=new Node<T>(data);
if(root==NULL){
root=z;
n=1;
return;
}
z->parent=par;
if(data<=par->data)
par->left=z;
else
par->right=z;
n+=1;
}
void inorder(Node<T> *p=root){
if(p){
inorder(p->left);
cout<<p->data<<" ";
inorder(p->right);
}
}
int main(){
BinarySearchTree<int> *t=new BinarySearchTree<int>();
t->insert(5);
t->insert(15);
t->insert(3);
t->insert(14);
t->insert(25);
t->insert(10);
t->inorder();
}
在第27行有一个编译错误,(即Node *root;),它读:"无效使用非静态数据成员'BinarySearchTree::root'"。我认为这与我在函数'insert'和'inorder'中包含的默认参数有关,因为当我删除默认参数'root'时,我不会得到错误。
我的问题是,发生了什么,我该如何解决?如果可能,我希望保留root的默认参数。
如果有关系的话,我在Windows 8.1上使用了一个名为"Quincy 2005"的软件来编译(出于某些原因)。
默认值必须是文字,而不是变量名。
另外,带有默认值的参数必须排在参数列表的最后。
,而使用:
void insert(Node<T> *p, T data) { ... }
// overload with only one argument
void insert(T data)
{
insert(root, data)
}
在
void insert( Node<T>* p = root ,T data ) {...}
有2个错误
首先,您只能对从最后一个形参开始并向后的参数使用默认值。因为你没有给data一个默认值,这是一个错误(解决方案重新排序参数,没有默认值的必须先出现)。
其次,值root
是this
的成员,在声明点没有this
。解决方案,如果你需要一个默认值,使用 nullptr
作为默认值,并在你的功能测试中为 nullptr
,如果是这样,使用root
代替。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员