模板冲突的类型-但类型应该是相同的cfr类层次结构
templates conflicting type - yet types should be the same cfr class hierarchy?
我有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
将在放置时在函数体中进行转换。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 模板冲突的类型-但类型应该是相同的cfr类层次结构