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

时间:2011-08-17 14:21:01

标签: c++ templates constructor

这是我第一次涉足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))){}
};

BinaryTree类

#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的{​​{1}}构造函数在我将其包含在主代码中时起作用,但它似乎不适用于我的(BinaryTreeNode<T>&, BinaryTreeNode<T>&, const T& value)模板。谁知道为什么?

3 个答案:

答案 0 :(得分:4)

在初始化表达式_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引用,因此您仍需要修复它。

答案 1 :(得分:3)

在两个课程声明后你都错过了;

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) {}
};

答案 2 :(得分:0)

我认为您需要BinaryTree<T>();

形式的构造函数