在multimap中将结构作为键传递时出错

时间:2013-09-06 08:26:10

标签: c++ qt stl

我正在尝试使用多键结构作为键创建一个多图,我收到的错误如下所示:

代码:

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

    char InstrumentName[6];
    char Symbol[10];
    long long ExpiryDate;
}
std::multimap<MultiKey, stCont> cont_map;

错误:

C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xfunctional:125: error: C2678: binary '<' : no operator found which takes a left-hand operand of type 'const MultiKey' (or there is no acceptable conversion)
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qchar.h(391): could be 'bool operator <(QChar,QChar)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qbytearray.h(538): or       'bool operator <(const QByteArray &,const QByteArray &)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qbytearray.h(540): or       'bool operator <(const QByteArray &,const char *)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qbytearray.h(542): or       'bool operator <(const char *,const QByteArray &)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(565): or       'bool operator <(const QString &,const QString &)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(625): or       'bool operator <(const char *,const QString &)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(632): or       'bool operator <(const char *,const QStringRef &)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(975): or       'bool operator <(QLatin1String,QLatin1String)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(1032): or       'bool operator <(const char *,QLatin1String)' [found using argument-dependent lookup]
C:\Qt\Qt5.0.2\5.0.2\msvc2010\include\QtCore/qstring.h(1304): or       'bool operator <(const QStringRef &,const QStringRef &)' [found using argument-dependent lookup]
while trying to match the argument list '(const MultiKey, const MultiKey)'

我已经为myComp编写了这段代码:

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;
       }
    };

现在我收到了一个错误:

C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xtree:1546: error: C3848: expression having type 'const myComp' would lose some const-volatile qualifiers in order to call 'bool myComp::operator ()(const MultiKey &,const MultiKey &)'

4 个答案:

答案 0 :(得分:2)

因为您没有为map

定义自定义比较器(比较功能)

可能基于您的ExpiryDate

    struct myComp
    {
       bool operator() (const MultiKey& lhs, const MultiKey& rhs)
       {
           return lhs.ExpiryDate < rhs.ExpiryDate ;
       }
    };

然后使用:

std::multimap<MultiKey, stCont,myComp> cont_map;

答案 1 :(得分:1)

您需要定义一些方法来对地图中的键进行排序。默认情况下,这是std::less<T>(重定向到operator<MultiKey不存在。struct multikey_compare { bool operator()(const MultiKey& a, const MultiKey& b) const { // Implementation } } 。您需要创建一个比较器并将其作为模板参数传递:

multimap

然后定义您的std::multimap<MultiKey, stCont, multikey_compare> cont_map;

{{1}}

答案 2 :(得分:0)

std::mapstd::multimap需要类似的密钥。如果您使用C ++ 1,则可以使用std::unordered_map / std::unordered_multimap,如果您需要无比的密钥。这又需要实现散列函数。否则,您可能需要查看boost::unordered

答案 3 :(得分:0)

至少,你需要定义:

bool operator < (const MultiKey& x, const MultiKey& y)
{
    // implement complete order relationship between x and y
}

如果你定义了这个,你还应该定义==,!=,&gt;,&lt; =和&gt; =(STL不需要超过&lt;定义,但它是一个很好的这样做的想法)。