对象没有正确实例化

时间:2016-09-24 00:33:15

标签: c++ c++11 visual-c++

我目前正在使用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)

我不确定它是否是命名空间问题。我觉得好像错过了什么。

1 个答案:

答案 0 :(得分:0)

该行

BSTHeader::BSTHeader bst();   // <----- ERROR

是名为bst的函数的声明,它不带任何参数并返回BSTHeader::BSTHeader

这被称为&#34;最令人烦恼的解析&#34;,并且通常用不太礼貌的语言描述。

如果要实例化实例,给构造函数没有参数,请删除()