我有一个字节数组,其中包含某些ID的事件ID和事件数据: {0x1,0x2,0x32} //例如,0x1 - eventId,0x2 - 其数据,0x32 - 另一个事件ID。
要解析它并创建Event对象,我创建了几个二进制函数,它们知道如何解释事件数据字节和一个以事件id为键的映射,以及指向std :: binary_function的指针作为值: / p>
map<uint8_t, SspProtocol::EventDataParser*>
其中SspProtocol :: EventDataParser是:
typedef unsigned char uint8_t; // declared in file stdint.h
[...]
class SspProtocol {
typedef std::binary_function<const std::vector<uint8_t>*, std::vector<uint8_t>::const_iterator*, Event> EventDataParser;
[...]
}
当我尝试调用此仿函数时出现编译器错误:
vector<SspProtocol::Event> SspProtocol::poll() {
vector<uint8_t> data = sendCommand(POLL);
vector<Event> events;
const vector<uint8_t>& const_data = data; // (*)
for (vector<uint8_t>::const_iterator i = const_data.begin(); i != const_data.end();) {
map<uint8_t, SspProtocol::EventDataParser*>& parsers = Event::eventParser();
EventDataParser& parser = *parsers[*i]; // (**)
Event event = parser(&const_data, &i); // (***)
events.push_back(event);
}
return events;
}
我收到了错误( * ):
error: no match for call to
‘(protocols::ssp::SspProtocol::EventDataParser
{aka std::binary_function<const std::vector<unsigned char>*,
__gnu_cxx::__normal_iterator<const unsigned char*,
std::vector<unsigned char> >*, protocols::ssp::SspProtocol::Event>
}) (const std::vector<unsigned char>*,
std::vector<unsigned char>::const_iterator*)’
为什么我的g ++编译器使用__gnu_cxx :: __ normal_iterator *以及为什么它与const_iterator *不兼容?我该怎么办呢?
PS:我特意在行()上添加了const引用,使第一个模板参数具有const-qualifier,并且我还分离了仿函数调用并从地图中获取仿函数(参见第(行) *))。 这让我觉得错误是在函子调用上,它没有连接到map和auto_ptr。
P.P.S.:Here是一个示例事件解析器:
class SspProtocol::EventWithoutDataParser
: public SspProtocol::EventDataParser {
bool ackEvent_;
public:
EventWithoutDataParser(bool ackEvent = false) : ackEvent_(ackEvent) {}
Event operator()(const vector<uint8_t>* data, vector<uint8_t>::const_iterator* i) {
Event event(*(*i));
++(*i);
return event;
}
bool ackEvent() const { return ackEvent_; }
};
答案 0 :(得分:1)
查找std :: binary_function(http://en.cppreference.com/w/cpp/utility/functional/binary_function)的文档。它是二进制函数的基类,除了记录参数类型和返回类型之外什么都不做。它没有定义实际的operator()(a,b),所以很明显它不能在/ this指针的实例上调用。相反,请尝试使用
std::function<Event(const std::vector<uint8_t>*, std::vector<uint8_t>::const_iterator*)>
by-value (不是通过指针,它已经是一种高级函数指针)来存储解析器函数。可以检查std :: function是否空白并调用。