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

templates conflicting type - yet types should be the same cfr class hierarchy?

本文关键字:类型 cfr 层次结构 冲突      更新时间:2023-10-16

我有usb设备。我有

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

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

类层次结构类似于设备类型X特定的设备

所以每个特定的设备都是一个设备类型X

deviceTypeX包含特定Device需要实现的虚拟函数。usbdevice包含所有(我的(设备的通用usb内容,如连接方法等。

其想法是,包含上述项的类(让我们将其实例称为"usbdevices"(将具有公共方法,这些方法将允许写入硬件,以便将所有内容抽象掉。

我在"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/usbevices.h:47:10:注意:候选者:template void usbdevices::addInstance(std::unordered_map>>,int,std::unique_ptr<_Tp>,int(void addInstance(std::unordereded_map>>&outer,^~~~~~~~~~~…/hardware/usbdevices.h:47:10:注意:模板参数推导/替换失败:…/hardware/usbdevices.cpp:121:114:注意:推断出参数"_Tp"("设备类型X"answers"特定设备"(的冲突类型

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

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

C++模板只匹配给定的精确类型,而不尝试找到兼容的类型。这就是错误deduced conflicting types for parameter ‘_Tp’ (‘deviceTypeX’ and ‘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将在放置时在函数体中进行转换。