我目前正在使用VS2015。
我正在尝试用c ++创建一个二叉搜索树,这样我就可以学习语言和数据结构,同时试着看看我是否可以遵循良好的实践。但是,我遇到的问题是我没有在驱动程序文件中正确地实例化对象。
BSTHeader.h
#pragma once
/*
Properties of Binary Search Tree:
1.) Elements less than root will go to the left child of root
2.) Elements greater than root will go to the right child of root
*/
#include <memory>
// Binary Search Tree handler class
class BSTHeader {
/*
Naive implementation of BSTNode (non-generic version)
Nested class is private, but it's internal fields and member functions
are public to outer class: BSTHeader
*/
class BSTNode {
public:
int data;
std::unique_ptr<BSTNode> left;
std::unique_ptr<BSTNode> right;
BSTNode(int val) {
data = val;
left = NULL;
right = NULL;
}
~BSTNode() {}
};
std::unique_ptr<BSTNode> root; // Root of BST
unsigned int size; // Total amount of nodes in tree from root
public:
BSTHeader();
BSTHeader(int val);
~BSTHeader();
bool insert(std::unique_ptr<BSTNode>& root, int val);
}
BSTHeader.cpp
#include "BSTHeader.h"
/*
Constructors:
*/
BSTHeader::BSTHeader() {
root = NULL;
size = 0;
}
BSTHeader::BSTHeader(int val) {
root = std::unique_ptr<BSTNode>(new BSTHeader::BSTNode(val)); // Smart pointer to an internal BSTNode
size = 1;
}
BSTHeader::~BSTHeader() {} // Empty destructor from use of smart pointer
/*
Member functions:
*/
bool BSTHeader::insert(std::unique_ptr<BSTNode>& root, int val) {
if (root == NULL) { // Place new element here
root = std::unique_ptr<BSTNode>(new BSTHeader::BSTNode(val));
size++;
return true;
}
if (val < root.get()->data) { // val < root
insert(root.get()->left, val);
}
else if (val > root.get()->data) { // val > root
insert(root.get()->right, val);
}
我得到的问题是在这里,我相信我正在尝试实例化一个BSTHeader对象。
Program.cpp
#include "BSTHeader.h"
int main()
{
BSTHeader::BSTHeader bst(); // <----- ERROR
return 0;
}
我得到的错误是cannot determine which instance of overloaded function "BSTHeader:BSTHeader" is intended
然而,每当我这样做:
BSTHeader bst()
即使上面的错误没有出现,由于insert(..., ...)
,我无法访问bst.insert(..., ...)
对象的expression must have class type
函数。
然而一切正常,我可以通过使用重载的构造函数来执行此操作来访问所有成员方法:BSTHeader bst(5)
。
我不确定它是否是命名空间问题。我觉得好像错过了什么。
答案 0 :(得分:0)
该行
BSTHeader::BSTHeader bst(); // <----- ERROR
是名为bst
的函数的声明,它不带任何参数并返回BSTHeader::BSTHeader
。
这被称为&#34;最令人烦恼的解析&#34;,并且通常用不太礼貌的语言描述。
如果要实例化实例,给构造函数没有参数,请删除()
。