我有一个模板类btree,并在头文件的公共定义中定义了一个struct Node
struct Node {
vector<Node> chi_;
vector<T> val_;
Node *par_;
Node(size_t n, Node *parent) : par_(parent) {
chi_.reserve(n+1);
val_.reserve(n);
}
~Node() {
chi_.clear();
val_.clear();
}
};
作为我的operator = / copy构造函数的一部分,我想创建一个递归函数'addAll'
template <typename T>
void btree<T>::addAll(struct Node* &one, struct Node* const& two) {
for(unsigned int a = 0; a < two.val_.size(); a++)
one.val_.push_back(two.val_.at(a));
for(unsigned int a = 0; a < two.chi_.size(); a++) {
Node *newNode = new Node(max, one);
addAll(newNode, two.chi_.at(a));
one.chi_.push_back(newNode);
}
}
函数声明对我来说很奇怪 - 我尝试了一些简单的东西 btree:addAll(Node&amp; one,const Node&amp; two) 但是这产生了很多难以理解的编译器错误,但是我终于通过在上面声明它如上所述来接受所述函数的存在
void addAll(struct Node*&, struct Node* const&);
在我的头文件中。
我现在遇到的问题是在我的函数中访问Node的数据元素,我得到以下编译错误:
btree.tem:28:23: error: request for member 'val_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:29:3: error: request for member 'val_' in 'one', which is of non-class type 'btree<long int>::Node*'
btree.tem:29:3: error: request for member 'val_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:31:23: error: request for member 'chi_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:33:3: error: request for member 'chi_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:34:3: error: request for member 'chi_' in 'one', which is of non-class type 'btree<long int>::Node*'
不确定我是否在这里正确宣布事情,但这个特殊问题真的让我感到困惑(接近一天半的不同修补方法,但无济于事)
答案 0 :(得分:0)
取消引用指向类的指针时,应使用->
。
例如:
for(unsigned int a = 0; a < two->val_.size(); a++)
one->val_.push_back(two->val_.at(a));
答案 1 :(得分:0)
你已经创建了addall函数,它是btree类的一部分,另一个函数只是类之外的函数。您将betree类定义为模板,但您的节点类是引用类型T的节点类。如果您树可以接受更多然后节点然后添加all应该引用T而不是节点如果它只能使用节点类它不应该是模板。
答案 2 :(得分:0)
one
和two
是对指针的引用,因此您需要使用->
运算符来访问成员。
one->val_.push_back(two->val_.at(a));
此外,在C ++中,您在引用类型时不需要使用struct
关键字。
template <typename T>
void btree<T>::addAll(Node* &one, Node* const& two)