gpt4 book ai didi

c++ - 将 int 转换为通用模板类型

转载 作者:行者123 更新时间:2023-11-28 01:20:18 25 4
gpt4 key购买 nike

我在 TreeWrapper.h 中有以下函数:

template<typename Key, typename Data, class Compare=std::less<Key>>
class TreeWrapper{
// .............
public:
void addNode(Key &key, Data &data) {
currentAVLTree.addNode(key, data);
}

我想使用以下命令:

currentGroup.addNode(group, group.getTotal());

但是 getTotal 返回 int 而不是 Data。有可能以某种方式转换它吗?我认为 Data 是一种通用类型,可以获取任何类型。为什么它不起作用?

编辑:

TreeWrapper.h中重要的部分:

template<typename Key, typename Data, class Compare=std::less<Key>>
class TreeWrapper {
AVLTree<Key, Data, Compare> currentAVLTree;

public:
void addNode(Key &key, Data &data) {
currentAVLTree.addNode(key, data);
}
};

AVLTree.h中:

template<typename Key, typename Data, class Compare=std::less<Key>>
class AVLTree {
Compare keyCompare;
AVLNode<Key, Data> *root;
int length;

public:

bool addNode(Key &key, Data &data) {
// impl
}
};

GroupWrapper 中:

class GroupWrapper {
private:
TreeWrapper<Group, Group, compareGroup> currentGroup;
public:
void addGroup(Group group) {
currentGroup.addNode(group, group.getTotal());
}
};

但我收到一个错误:Parameter type mismatch: Expression must be lvalue on group.getTotal() 并且它建议更改 Dataint。为什么?

最佳答案

I thought that Data is a generic type that get anytype.

不完全是。 Data 确实代表了一个泛型类型,但该 View 仅在定义模板时成立。使用模板时,它会被实例化。实例化的一部分涉及为通用模板参数提供具体的替换。对于该实例化,替换是固定的,不再是通用的。

例如,查看您的 TreeWrapper 模板的声明。

template<typename Key, typename Data, class Compare=std::less<Key>>
class TreeWrapper

使用和实例化此模板的一种方法是使用如下一行:

TreeWrapper<Group, Group, compareGroup> currentGroup;

实际上,这采用了 TreeWrapper 模板并将“Key”的每个实例替换为“Group”,每个实例“Data”与“Group”,以及“Compare”的每个实例与“compareGroup”。结果是 currentGroup 类型的定义。因此,addNode 的签名变为:

void addNode(Group &key, Group &data)

您可以尝试调用 currentGroup.addNode(group, group.getTotal()),但是由于 getTotal() 返回一个 int (不可转换为Group &),签名不匹配。

(仅)此调用的解决方案是建议更改 Data 的具体替换。如果你要使用

TreeWrapper<Group, int, compareGroup> currentGroup;

那么 addNode 的签名就是

void addNode(Group &key, int &data)

和对 currentGroup.addNode(group, group.getTotal()) 的调用几乎* 匹配。但是,这可能会把其他事情搞砸,除非您决定使用 Group 作为树的数据类型而不了解树将保存什么类型的数据。


* “几乎”,因为这会将一个临时变量绑定(bind)到一个非常量引用。由于 addNode 听起来好像不需要更改其任何一个参数,因此它们应该是常量引用(或非引用值),这将使您的调用正常进行。

void addNode(const Key &key, const Data &data)

这应该在 TreeWrapperAVLTree 中完成。

关于c++ - 将 int 转换为通用模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com