在模板类中使用结构体作为参数并访问它们的元素

Using structs as paramaters and accessing their elements in a template class

本文关键字:访问 参数 元素 结构体      更新时间:2023-10-16

我有一个模板类btree,并在头文件的公共定义中定义了一个结构体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 & 1, const Node & 2)但这产生了一些难以理解的编译器错误,但我最终通过上面的声明让它接受了所述函数的存在+具有

void addAll(struct Node*&, struct Node* const&);

在我的头文件

我现在遇到的问题是访问我的函数内的节点的数据元素,我得到以下编译错误:

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*'

我不确定我在这里声明的东西是否正确,但是这个特殊的问题真的难倒了我(接近一天半的不同方法来修补它,但无济于事)

onetwo是对指针的引用,所以需要使用->操作符来访问成员

one->val_.push_back(two->val_.at(a));

同样,在c++中,当引用类型时不需要使用struct关键字。

template <typename T>
void btree<T>::addAll(Node* &one, Node* const& two)

在解引用指向类的指针时应该使用->

例如:

for(unsigned int a = 0; a < two->val_.size(); a++)
    one->val_.push_back(two->val_.at(a));

您已经创建了添加所有函数,其中一个是您的btree类的一部分,另一个只是类外的函数。你的树类被定义为模板,但你的节点类是引用类型T的那个。如果你的树可以接受多个节点,那么添加所有应该引用一个T,而不是一个节点,如果它只能利用节点类,它不应该是一个模板。