在模板类中使用结构体作为参数并访问它们的元素
Using structs as paramaters and accessing their elements in a template class
我有一个模板类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*'
我不确定我在这里声明的东西是否正确,但是这个特殊的问题真的难倒了我(接近一天半的不同方法来修补它,但无济于事)
one
和two
是对指针的引用,所以需要使用->
操作符来访问成员
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,而不是一个节点,如果它只能利用节点类,它不应该是一个模板。
相关文章:
- 使用不带参数的函数访问结构元素
- 从C++dll访问C#中的一行主要参数
- 函数是否可以访问传递给main()的参数
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 如何从其他功能C++访问参数?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 如何访问模板参数自己的模板参数?
- 如何访问QT中传递给程序的参数
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 通过C++函数对象类访问参数
- 如何使用和访问参数包的模板参数包
- ARM访问参数与返回值
- 为什么 == 重载可以访问参数的私有成员
- C++中的软映像访问参数
- 重新配置C++代码以处理“警告:未按顺序修改和访问参数”
- 具有多个可访问参数的C++访客模式
- 方法可以访问参数的私有成员吗?
- 在这种特殊情况下,您是否建议使用程序集访问参数
- 如何访问参数包中的第一个参数
- 旧代码:将函数的访问参数作为参数传递给另一个函数