binary_function,调用时编译错误

时间:2014-03-12 06:50:06

标签: c++ map stl

我有一个字节数组,其中包含某些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_; }
};

1 个答案:

答案 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是否空白并调用。