gpt4 book ai didi

c++ - 模板冲突类型 - 但类型应该是相同的 cfr 类层次结构?

转载 作者:行者123 更新时间:2023-11-28 04:36:05 26 4
gpt4 key购买 nike

我有 USB 设备。我有

std::unordered_map<int, std::unordered_map<int, std::unique_ptr<deviceTypeX>>> deviceTypeXMap;

存储我为设备创建的实例。

类层次结构类似于 usbdevice-deviceTypeX-specificDevice

所以每个特定的设备都是一个 deviceTypeX

deviceTypeX包含specificDevice需要实现的虚函数。 usbdevice 包含所有(我的)设备共有的通用 usb 东西,例如连接方法等。

想法是,包含上述项目的类(我们称其为“usbdevices”实例)将具有允许写入硬件的公共(public)方法,以便所有内容都被抽象掉。

我在“usbdevices”头文件中有以下模板:

template <typename classType>
void addInstance(std::unordered_map<int, std::unordered_map<int, std::unique_ptr<classType>>> &outer,
int outerKey, std::unique_ptr<classType> instanceToAdd, int innerKey) {
auto outerSearch = outer.find(outerKey);
if (outerSearch != outer.end()) {
outerSearch->second.try_emplace(innerKey, std::move(instanceToAdd));
}
else{ //outer key not found }
}

添加实例。一旦像这样发生热插拔事件,我就使用回调添加它们

addInstance(deviceTypeXMap, desc.idVendor, std::make_unique<specificDevice>(dev, ctx), desc.idProduct);

编译失败

在包含自 .../hardware/usbdevices.cpp:5:0 的文件中:.../hardware/usbdevices.h:47:10: 注意:候选:模板 void usbdevices::addInstance(std::unordered_map >>&, int, std::unique_ptr<_Tp>, int) void addInstance(std::unordered_map>> &outer, ^~~~~~~~~~~.../hardware/usbdevices.h:47:10: 注意:模板参数推导/替换失败:.../hardware/usbdevices.cpp:121:114: 注意:推断出参数“_Tp”(“deviceTypeX”和“specificDevice”)的类型冲突

为什么 specificDevice 和 deviceTypeX 有冲突?我正在学习模板...如果我不使用模板,所描述的方法是可行的,但显然我需要模板,否则我将不得不为 deviceTypeX、deviceTypeY 等创建多个 addInstance 方法。

我不明白。我需要做什么才能让它发挥作用?

最佳答案

C++ 模板只匹配给定的确切 类型,而不试图找到兼容的类型。这是错误的原因 - 推断出参数“_Tp”(“deviceTypeX”和“specificDevice”)的类型冲突

要解决这个问题,您可以让函数接受 2 个模板参数:

template <typename outerType, typename instanceType>
void addInstance(std::unordered_map<int, std::unordered_map<int, std::unique_ptr<outerType>>> &outer,
int outerKey, std::unique_ptr<instanceType> instanceToAdd, int innerKey) {
auto outerSearch = outer.find(outerKey);
if (outerSearch != outer.end()) {
outerSearch->second.try_emplace(innerKey, std::move(instanceToAdd));
}
else{ //outer key not found }
}

instanceToAdd在被放置时会在函数体中进行转换。

关于c++ - 模板冲突类型 - 但类型应该是相同的 cfr 类层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51397200/

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