Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;模板限制成员构造函数 这是我第一次进入C++模板,我尝试构造一个 BinaryTree 模板,帮助我解决一个项目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))){} }; 模板 二元树烯类 { 私人: 二元树烯醇*(左); 双核三烯酸*(右); T*_值; 公众: 二叉树烯醇(); 显式二进制树节点(常数T&value):_值(&(T(value)){ 二进制树节点(二进制树节点和左、二进制树节点和右、常量T和值): _左(&左),_右(&右),_值(&(T(值)){ };_C++_Templates_Constructor - Fatal编程技术网

C++;模板限制成员构造函数 这是我第一次进入C++模板,我尝试构造一个 BinaryTree 模板,帮助我解决一个项目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))){} }; 模板 二元树烯类 { 私人: 二元树烯醇*(左); 双核三烯酸*(右); T*_值; 公众: 二叉树烯醇(); 显式二进制树节点(常数T&value):_值(&(T(value)){ 二进制树节点(二进制树节点和左、二进制树节点和右、常量T和值): _左(&左),_右(&右),_值(&(T(值)){ };

C++;模板限制成员构造函数 这是我第一次进入C++模板,我尝试构造一个 BinaryTree 模板,帮助我解决一个项目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))){} }; 模板 二元树烯类 { 私人: 二元树烯醇*(左); 双核三烯酸*(右); T*_值; 公众: 二叉树烯醇(); 显式二进制树节点(常数T&value):_值(&(T(value)){ 二进制树节点(二进制树节点和左、二进制树节点和右、常量T和值): _左(&左),_右(&右),_值(&(T(值)){ };,c++,templates,constructor,C++,Templates,Constructor,二进制树类 #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) { }

二进制树类

#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;}
};
#包括“BinaryTreeNode.h”
模板
类二叉树
{
私人:
龙胆根;
二元三元*_电流;
无符号整数大小;
公众:
BinaryTree():大小(0),_根(0),_当前(0){
显式BinaryTree(BinaryTree和leftTree、BinaryTree和rightTree、常量T和值):
大小(leftTree.size()+rightree.size()+1),_根(leftTree.root(),rightree.root(),值),_当前(_根){}
显式二叉树(const T&value):大小(1),_根(value){}
const BinaryTreeNode&Root()const{return*\u 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
错误C2359:'BinaryTree::\u root':非类类型的成员需要单个初始值设定项表达式
错误C2440:“正在初始化”:无法从“const int”转换为“BinaryTreeNode*”
错误C2439:“BinaryTree::\u根”:无法初始化成员

(BinaryTreeNode&,BinaryTreeNode&,const T&value)
BinaryTreeNode
构造函数在我将其包含在主代码中时可以工作,但在我的
BinaryTree
模板下似乎不工作。有人知道为什么吗

我相信您需要一个
BinaryTree()形式的构造函数

我认为您需要一个
BinaryTree()形式的构造函数
在初始化表达式
\u root(leftTree.root(),rightree.root(),value)
中,
\u root
是一个指针。您只能将其初始化为另一个指针。也许您的意思是将其初始化为指向基于这些参数构造的新节点的指针

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

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


更新:我在编辑后更改了第一个构造函数调用,但正如@Luc所说,构造函数采用非常量参数,但
Root()
仅提供常量引用,因此您仍然需要修复该问题。

在初始化表达式
\u root
是指针。您只能将其初始化为另一个指针。也许您的意思是将其初始化为指向基于这些参数构造的新节点的指针

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

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


更新:我在编辑后更改了第一个构造函数调用,但正如@Luc所说,您的构造函数使用非常量参数,但
Root()
只提供常量引用,因此您仍然需要修复它。

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

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) {}
};
模板
二元树烯类
{
私人:
二元树烯醇*(左);
双核三烯酸*(右);
T*_值;
公众:
二叉树烯醇();
显式二进制树节点(常数T&value):_值(&(T(value)){
二进制树节点(二进制树节点和左、二进制树节点和右、常量T和值):
_左(&左),_右(&右),_值(&(T(值)){
};
模板
类二叉树
{
私人:
龙胆根;
二元三元*_电流;
无符号整数大小;
公众:
BinaryTree():大小(0),_根(0),_当前(0){
显式BinaryTree(BinaryTree和leftTree、BinaryTree和rightTree、常量T和值):
大小(leftTree.size()+rightree.size()+1),_根(leftTree.root(),rightree.root(),值),_当前(_根){}
显式二叉树(const T&value):大小(1),_根(value){}
};

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

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) {}
};
模板
二元树烯类
{
私人:
二元树烯醇*(左);
双核三烯酸*(右);
T*_值;
公众:
二叉树烯醇();
显式二进制树节点(常数T&value):_值(&(T(value)){
二进制树节点(二进制树节点和左、二进制树节点和右、常量T和值):
_左(&左),_右(&右),_值(&(T(值)){
};
模板
类二叉树
{
私人:
龙胆根;
二元三元*_电流;
无符号整数大小;
公众:
BinaryTree():大小(0),_根(0),_当前(0){
显式BinaryTree(BinaryTree和leftTree、BinaryTree和rightTree、常量T和值):
大小(leftTree.size()+rightree.size()+1),_根(leftTree.root(),rightree.root(),值),_当前(_根){}
显式二叉树(const T&value):大小(1),_根(value){}
};

没有,没有,只是试了一下!问题来自于显式二进制树(BinaryTree&,BinaryTree&,const T&)
构造函数。谢谢你的建议。不,不是,只是试试看!问题来自于显式二进制树(BinaryTree&,BinaryTree&,const T&)
构造函数。谢谢您的建议。您缺少
在课程结束时。
explicit
关键字仅对具有单个参数的构造函数有用
\u value(&(T(value))
使用指向临时值的指针初始化
\u value
,该临时值将在语句之后立即销毁,从而产生悬空指针<代码>BinaryTreeNode::BinaryTreeNode()
已声明但未定义,这是故意的吗?如果是这样的话,你应该保密。@Luc Touraille确实是一个很好的回答,而不是一个评论。@Neuron不是真正的s
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) {}
};