0

そのように宣言された std::set 値で unordered_map に挿入しようとしています:

class Database {
...
private:
    struct CountryRCID {
        int RCID;
        int Vote;
    };
    struct comp {
        bool operator() (const CountryRCID& left, const CountryRCID& right) const {
            return left.RCID < right.RCID;
        }
    };
    std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes;
};

データベースコンストラクターで、ファイルからデータを読み取り、unordered_map に挿入しようとしています

Database() {
    char CNT[3];
    CountryRCID RCIDVote;
    ... Insert data into CNT and RCIDVote ...
    CNTVotes.insert(std::make_pair(CNT, RCIDVote));
}

そして、両方でコードをコンパイルしようとしました:

g++ main.cpp -std=gnu++0x

g++ main.cpp -std=c++0x

しかし、エラーが発生しています:

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66,
                 from /usr/include/c++/4.4/bits/char_traits.h:41,
                 from /usr/include/c++/4.4/ios:41,
                 from /usr/include/c++/4.4/istream:40,
                 from /usr/include/c++/4.4/fstream:40,
                 from db.h:1,
                 from main.cpp:1:
/usr/include/c++/4.4/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(std::pair<_U1, _U2>&&) [with _U1 = char*, _U2 = Database::CountryRCID, _T1 = const char* const, _T2 = std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >]’:
db.h:50:   instantiated from here
/usr/include/c++/4.4/bits/stl_pair.h:107: error: no matching function for call to ‘std::set<Database::CountryRCID, Database::comp, std::allocator<Database::CountryRCID> >::set(Database::CountryRCID)’
/usr/include/c++/4.4/bits/stl_set.h:212: note: candidates are: std::set<_Key, _Compare, _Alloc>::set(std::initializer_list<_CharT>, const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:199: note:                 std::set<_Key, _Compare, _Alloc>::set(std::set<_Key, _Compare, _Alloc>&&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:188: note:                 std::set<_Key, _Compare, _Alloc>::set(const std::set<_Key, _Compare, _Alloc>&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:145: note:                 std::set<_Key, _Compare, _Alloc>::set(const _Compare&, const _Alloc&) [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]
/usr/include/c++/4.4/bits/stl_set.h:136: note:                 std::set<_Key, _Compare, _Alloc>::set() [with _Key = Database::CountryRCID, _Compare = Database::comp, _Alloc = std::allocator<Database::CountryRCID>]

また、さまざまな挿入方法を試しました。

CNTVotes[CNT] = RCIDVote;

std::pair <const char*, CountryRCID> test (CNT, RCIDVote);
CNTVotes.insert(test);

同様のエラーが発生するだけです

なぜそれが機能しないのか、そしてこれを機能させるために何ができるのかを誰かが理解するのを手伝ってくれれば、とても感謝しています。

ありがとうございました。

4

4 に答える 4

4

おそらくあなたの問題とは直接関係ありませんが、 char * のマップは実際には機能しません。それ以外の :

 std::unordered_map<const char*, std::set<CountryRCID, comp> > CNTVotes;

あなたはおそらく欲しい:

 std::unordered_map<std::string, std::set<CountryRCID, comp> > CNTVotes;
于 2011-05-17T18:49:50.870 に答える
2

CountryRCIDは type ですがstruct、 ではありませんstd::set...のテンプレート引数と一致させるには、最初にstd::setof 型std::set<CountryRCID>を作成し、引数でそれを使用する必要があります。makePair()unordered_map

struct compまた、ファンクターは冗長だと思います...構造体に対してoperator<()andを定義するだけです。operator==()CountryRCID

あなたがそれを行い、 to の宣言を変更する場合(ところで、キー値としてa ではなくCNTVotes使用するというニールの提案を借りていることに注意してください...それは非常に良い考えだと思います)std::stringconst char*

std::unordered_map<std::string, std::set<CountryRCID> > CNTVotes;

次に、次のことができます。

CountryRCID RCIDVote;
//... Insert data into CNT and RCIDVote ...
std::string CNTString(CNT);
std::set<CountryRCID> RCIDVoteSet;  // <== make a std::set of type set<CountryRCID>
RCIDVoteSet.insert(RCIDVote);
CNTVotes.insert(std::make_pair(CNTString, RCIDVoteSet));
于 2011-05-17T18:50:46.307 に答える
1

そのセットに入る型の単一のオブジェクトからセットを作成するコンストラクターはありません。一時的なセットを作成して項目を追加し、それを使用して に追加する必要がありunordered_mapます。

iterator, iterator編集:実際には、実際のオブジェクトがあるので、次のようにコンストラクターを回避できると思います:

CNTVotes.insert(std::make_pair(CNT, std::set(&RCIDVote, &RCIDVote + 1)));

于 2011-05-17T18:49:14.683 に答える
0

Jasonが述べたように、マップ内の値は単一の構造体ではなくセットCountryRCIDです。マップのセットにを追加する場合はCountryRCID、おそらく次のようなものが必要です。

typedef std::set<CountryRCID, comp> MySet;
typedef std::unordered_map<const char*, MySet> MyMap;

MyMap::_Pairib ret = CNTVotes.insert(std::make_pair(CNT, MySet()));
ret.first->second.insert(RCIDVote);
于 2011-05-17T18:57:59.627 に答える