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

次のように multimap コードを書き直して、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 に答える
1

operator <のために書いてみませんMultiKeyか?myCompまたは、とにかく必要なものではないため、変更する必要がありますmultimap(より小さい比較が必要です)。

于 2013-09-06T10:55:33.210 に答える
1

The C++11 Standard§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_compareは ですconst。さて、私は標準を誤解しているかもしれませんが、operator()が非constクラスの場合、この定義は無効のようCompareです。

一部の人々にとってなぜそれが機能するのかについて...おそらく、インスタンス化ルールに関するいくつかの細かい点により、これがエラーになるのを防ぐことができます。または、実装が標準の型定義に厳密に従う必要はありません。もしそうなら、The Standardに詳しい人が明確にしてくれたらうれしいです.

于 2013-09-06T11:12:48.527 に答える
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 に答える