我正在構建一個軟體,其中一個類負責記錄資訊源和命令(兩者都被分組為請求),其中所有請求都插入到 multimap 中,其中 multimap 由請求名稱鍵入,每個元素指向請求保存管理資訊和回呼函式指標的結構,從這個軟體中洞察。
執行回呼以發出命令或獲取資訊,直到這里一切正常。
為了啟用基于訂閱的資訊傳遞,我引入了一個由請求迭代器鍵入的新映射,因此呼叫subscribe("infoID")軟體會查找精確匹配請求并回傳其迭代器。
因為這些迭代器對于每個請求都是唯一的,所以我發現使用它來鍵入訂閱映射很有用。關鍵點指向資訊訂閱者的回呼函式。
錯誤是:
錯誤:'operator<' 不匹配(運算元型別為 'const std::__detail::_Node_iterator<std::pair<const std::__cxx11::basic_string, request>, false, true>' 和 'const std: :__detail::__Node_iterator<std::pair<const std::__cxx11::basic_string, request>, false, true>') { return __x < __y; }
其次是15條編譯筆記“模板引數推導/替換失敗”:
'const std::__detail::_Node_iterator<std::pair<const std::__cxx11::basic_string, request>, false, true>' 不是從 'const std::pair<_T1, _T2>' { return __x < __y; 每一個都有一個獨特的來源:
const std::pair<_T1, _T2>,const std::reverse_iterator<_Iterator>(stl_function.h),const std::reverse_iterator<_Iterator>(stl_iterator.h), ... 等等。
這里完全錯誤。
代碼:
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <functional>
#include <map>
using namespace std;
struct request
{
string f1;
};
using SYS_REQMAP =unordered_multimap<string, request, hash<string>>;
using SYS_REQMAP_I =SYS_REQMAP::iterator;
using SYS_INFOSUB_CBF = function<void(string, string)>;
using SYS_INFOSUB_CBFS = vector<SYS_INFOSUB_CBF>;
using SYS_REQINF_SUBS = map<SYS_REQMAP_I, SYS_INFOSUB_CBFS>;
void cbf(const string& a, const string& b){}
int main()
{
SYS_REQINF_SUBS infoSubr;
SYS_REQMAP vm{{"cmd1", {"foo"}},
{"cmd2", {"bar"}}};
for (SYS_REQMAP_I it = vm.begin(); it != vm.end(); it )
{
infoSubr[it].push_back(cbf); // Compile error
}
}
void compilesOK()
{
using SYS_REQINF_SUBS_1 = std::map<int, SYS_INFOSUB_CBFS>;
SYS_REQINF_SUBS_1 subs1;
subs1[1].push_back(cbf); // Compiles OK
}
這是用于編譯和觀察輸出的 OnlineGDB 鏈接。
uj5u.com熱心網友回復:
錯誤的關鍵部分是:
stl_map.h:481:32: required from 'std::map<_Key, _Tp, _Compare, ....>
[with _Key = std::__detail::_Node_iterator ....
...
stl_function.h:386:20: error: no match for 'operator<'
std::map(又名有序映射)鍵必須是可比較的(operator<),但映射迭代器不可比較,因此不能在有序映射中使用。
最簡單的解決方案是使用其他型別。
其他解決方案是為 map 提供一個比較器 ( _Compare),告訴它如何比較迭代器,或者切換到 aunordered_map并提供一個哈希器來告訴它如何對迭代器進行哈希處理。
uj5u.com熱心網友回復:
迭代器需要自定義比較函式_Compare:
struct Compare_REQMAP_I
{
bool operator()(const SYS_REQMAP_I& lhs, const SYS_REQMAP_I& rhs) const {
return &lhs < &rhs;
}
};
using SYS_REQINF_SUBS = std::map<SYS_REQMAP_I, SYS_INFOSUB_CBFS, Compare_REQMAP_I>;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516297.html
標籤:C c 11多图
