c++模板限制成员构造函数

C++ Template Limiting Member Constructor

本文关键字:成员 构造函数 c++      更新时间:2023-10-16

这是我第一次尝试使用c++模板,我试图构建一个BinaryTree模板来帮助我解决一个Project Euler问题;然而,我似乎得到了一个错误,其中BinaryTree类不识别BinaryTreeNode的所有构造函数!下面是一段代码:

template <class T>
class BinaryTreeNode
{
private:
    BinaryTreeNode<T>* _left;
    BinaryTreeNode<T>* _right;
    T* _value;
public:
    BinaryTreeNode();
    explicit BinaryTreeNode(const T& value) : _value(&(T(value))) {}
    BinaryTreeNode(BinaryTreeNode<T>& left, BinaryTreeNode<T>& right, const T& value) :
        _left(&left), _right(&right), _value(&(T(value))){}
};

二进制树类

#include "BinaryTreeNode.h"
template <class T>
class BinaryTree
{
private:
    BinaryTreeNode<T>* _root;
    BinaryTreeNode<T>* _current;
    unsigned int size;
public:
    BinaryTree() : size(0), _root(0), _current(0) { }
    explicit BinaryTree(BinaryTree<T>& leftTree, BinaryTree<T>& rightTree, const T& value) : 
        size(leftTree.Size() + rightTree.Size() + 1), _root(leftTree.Root(), rightTree.Root(), value), _current(_root) {}
    explicit BinaryTree(const T& value) : size(1), _root(value) {}
    const BinaryTreeNode<T>& Root() const { return *_root;}
};

我得到这些错误。

error C2359: 'BinaryTree<T>::_root' : member of non-class type requires single initializer expression
error C2440: 'initializing' : cannot convert from 'const int' to 'BinaryTreeNode<T> *'
error C2439: 'BinaryTree<T>::_root' : member could not be initialized

(BinaryTreeNode<T>&, BinaryTreeNode<T>&, const T& value)BinaryTreeNode构造函数在我的主代码中包含它时有效,但它似乎在我的BinaryTree模板下不起作用。有人知道为什么吗?

在初始化表达式_root(leftTree.Root(), rightTree.Root(), value)中,_root是一个指针。你只能将它初始化为另一个指针。也许你的意思是将它初始化为一个指向基于这些参数构造的新节点的指针?

可以这样做:(在你编辑之后更新)

_root(new BinaryTreeNode<T>(leftTree.Root(), rightTree.Root(), value))

然而,这是非常危险的(考虑分配中的异常),您应该避免在类设计中使用原始指针,而使用智能管理指针。

类似地,初始化器_root(value)做了错误的事情,您可能希望:
_root(new BinaryTreeNode<T>(value))

(还要注意,应该按照成员的声明顺序初始化成员)

更新:我改变了编辑后的第一个构造函数调用,但正如@Luc所说,你的构造函数接受非const参数,但Root()只提供了一个const引用,所以你仍然需要解决这个问题。

您在两个类声明之后都错过了; !

template <class T>
class BinaryTreeNode
{
private:
    BinaryTreeNode<T>* _left;
    BinaryTreeNode<T>* _right;
    T* _value;
public:
    BinaryTreeNode();
    explicit BinaryTreeNode(const T& value) : _value(&(T(value))) {}
    BinaryTreeNode(BinaryTreeNode<T>& left, BinaryTreeNode<T>& right, const T& value) :
        _left(&left), _right(&right), _value(&(T(value))){}
};
template <class T>
class BinaryTree
{
private:
    BinaryTreeNode<T>* _root;
    BinaryTreeNode<T>* _current;
    unsigned int size;
public:
    BinaryTree() : size(0), _root(0), _current(0) { }
    explicit BinaryTree(BinaryTree<T>& leftTree, BinaryTree<T>& rightTree, const T& value) : 
        size(leftTree.Size() + rightTree.Size() + 1), _root(leftTree.Root(), rightTree.Root(), value), _current(_root) {}
    explicit BinaryTree(const T& value) : size(1), _root(value) {}
};

我认为你需要一个BinaryTree<T>();形式的构造函数