1

我正在尝试使用多键结构作为键来创建多映射,但出现以下错误:

代码:

struct stCont
{
    long long Tok;
    char Reserved;
    long long Asset;
}
struct MultiKey {

    char InstrumentName[6];
    char Symbol[10];
    long long ExpiryDate;
}
struct myComp
    {
       bool operator() (const MultiKey& lhs, const MultiKey& rhs)
       {
           if((lhs.ExpiryDate==rhs.ExpiryDate)&&(memcmp(lhs.InstrumentName,rhs.InstrumentName,6))&&(memcmp(lhs.Symbol,rhs.Symbol,10)))
           {
               return 1;
           }

           return 0;
       }
    };
std::multimap<MultiKey, stCont,myComp> cont_map;

错误:

expression having type 'const myComp' would lose some const-volatile qualifiers in order to call 'bool myComp::operator ()(const MultiKey &,const MultiKey &)'
4

4 回答 4

1

你为什么不只是写只是写operator <MultiKey?或者你必须改变myComp,因为它无论如何都不是multimap想要的(它想要一个小于比较)。

于 2013-09-06T10:55:33.210 回答
1

查看 C++11 标准§23.4.5.1和标题:

template <class Key, class T, class Compare = less<Key>,
    class Allocator = allocator<pair<const Key, T> > >
class multimap {
public:
    // ...
    class value_compare {
        friend class multimap;
    protected:
        Compare comp;
        value_compare(Compare c) : comp(c) { }
    public:
        typedef bool result_type;
        typedef value_type first_argument_type;
        typedef value_type second_argument_type;

        bool operator()(const value_type& x, const value_type& y) const {
            return comp(x.first, y.first);
        }
    };
    // ...
};

定义的比较函数class value_compareconstoperator()现在,我可能会误解标准,但如果是 non - constin class ,这个定义似乎是无效的Compare

至于为什么它对某些人有用......也许关于实例化规则的一些更好的点可以防止这是一个错误,或者实现不需要严格遵守标准中的类型定义;如果是这样,我会很高兴如果有人更精通标准可以澄清。

于 2013-09-06T11:12:48.527 回答
1

您应该像这样重写多映射代码并删除 mycomp 结构:

struct MultiKey {

    char InstrumentName[6];
    char Symbol[10];
    long long ExpiryDate;


    bool operator< (const MultiKey& lhs)const
    {
        if((lhs.ExpiryDate==ExpiryDate)&&(memcmp(lhs.InstrumentName,InstrumentName,6))&&(memcmp(lhs.Symbol,Symbol,10)))
                   {
                       return true;
                   }

                   return false;
    }


};
于 2013-09-06T11:30:26.503 回答
0

要修复编译错误,请将比较函数声明为const成员:

bool operator() (const MultiKey& lhs, const MultiKey& rhs) const
                                                           ^^^^^

然后你有另一个问题:比较器需要执行“小于”比较,但你的比较器进行相等比较。你想要类似的东西

if (lhs.ExpiryDate < rhs.ExpiryDate) return true;
if (lhs.ExpiryDate > rhs.ExpiryDate) return false;
if (memcmp(lhs.InstrumentName,rhs.InstrumentName,6) < 0) return true;
if (memcmp(lhs.InstrumentName,rhs.InstrumentName,6) > 0) return false;
if (memcmp(lhs.SymbolName,rhs.SymbolName,10) < 0) return true;
return false;

operator<您可能会发现重载比定义命名比较器类型更方便,以便您可以使用std::multimap<MultiKey, stCont>默认比较器。

于 2013-09-06T13:08:05.733 回答