我正在尝试使用多键结构作为键创建一个multimap,并得到了下面描述的一个错误:
代码:
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 &)'发布于 2013-09-06 08:28:15
因为您没有为您的map定义自定义比较器(比较函数)
可能是基于你的ExpiryDate
struct myComp
{
bool operator() (const MultiKey& lhs, const MultiKey& rhs)
{
return lhs.ExpiryDate < rhs.ExpiryDate ;
}
};然后使用:
std::multimap<MultiKey, stCont,myComp> cont_map;发布于 2013-09-06 08:30:25
您需要定义某种方式来对地图中的键进行排序。默认情况下,这是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;发布于 2013-09-06 08:27:49
std::map和std::multimap需要类似的密钥。如果您使用C++1,如果您需要无可比拟的键,可以使用std::unordered_map/std::unordered_multimap。这又需要实现散列函数。否则,您可能需要查看boost::unordered。
https://stackoverflow.com/questions/18653206
复制相似问题