【问题标题】:C++ Custom Comparison FunctorsC++ 自定义比较函子
【发布时间】:2020-07-11 21:56:38
【问题描述】:

我正在尝试将自定义函子传递给 std::map。

所以,我在 HEADER 文件中声明了以下仿函数和其成员是映射的类。

class Comp {
        bool g;
        public:
                Comp(bool greater) : g(greater) {}
                bool operator()(float lhs, float rhs) const {
                        if (g) return lhs >= rhs;
                        return lhs < rhs;
                }
};

class OrderBook {
        u_char OrderBookType;
        std::map<float, std::vector<float*>, Comp> OrderBookData;

        public:
                OrderBook(u_char);
                float best_bid_ask(int);
};

在一个 .cpp 文件中,我定义了 OrderBook 类的构造函数,用于初始化 std::map。

OrderBook::OrderBook(u_char bookType)  {
        OrderBookType = bookType;
        OrderBookData(Comp(bookType == 'B'));
}

但是,当我尝试编译程序时,我遇到了“类型不提供调用运算符”的错误:

error: type 'std::map<float, std::vector<float *>, Comp>' does not provide a call operator
        OrderBookData(Comp(bookType == 'B'));

我很困惑为什么会遇到这个错误。

非常感谢任何帮助。

【问题讨论】:

  • 一个不相关的问题是,当g(更大)为真时的比较不是严格的弱排序,因为它在两个值相等时返回真。你应该使用return lhs &gt; rhs;

标签: c++ c++11 functor


【解决方案1】:

你需要使用initializer list syntax来构造成员:

OrderBook::OrderBook(u_char bookType) :
    OrderBookType{bookType},
    OrderBookData{Comp{bookType == 'B'}} { }

在您尝试构建地图时,它已经是默认构建的。您使用的语法看起来像一个函数调用,因此编译器会在地图上寻找合适的 operator() 函数,但没有找到 - 因此出现错误。

【讨论】:

  • 我意识到构造函数的以下定义也有效。 OrderBook::OrderBook(u_char bookType): OrderBookType(bookType), OrderBookData(Comp(bookType == 'B')) {}。我希望能更好地理解为什么这与 OrderBook::OrderBook(u_char bookType) { OrderBookType = bookType; OrderBookData(Comp(bookType == 'B')); } 不同。
  • @VimellPresadYuvarajah 所有未在初始化列表中明确列出的数据成员都是默认构造的。因此,在您的代码中,这两个成员都是默认构造的,然后您将值分配给 OrderBookType。下一行尝试在OrderBookData 上调用operator(),但没有——它实际上根本没有尝试调用构造函数。
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多