2017-12-28 2 views
0

ich tbb::concurrent_unordered_map bin mit std::map in meinem Programm wie folgt zu ersetzen:Wie man weak_ptr in tbb :: concurrent_unordered_map verwendet?

Before: 

class KvSubTable; 
typedef std::weak_ptr<KvSubTable> KvSubTableId; 
std::map<KvSubTableId, int, std::owner_less<KvSubTableId> > mEntryMap; 

Jetzt benutze ich tbb::concurrent_unordered_map, std::map zu ersetzen, aber es hat einige Fehler kompilieren:

tbb::concurrent_unordered_map<KvSubTableId, int, tbb::tbb_hash<KvSubTableId>, std::owner_less<KvSubTableId> > mEntryMap; 

cpp/ext/amd64/include/tbb/internal/_tbb_hash_compare_impl.h:66:37: error: invalid static_cast from type 'const std::weak_ptr' to type 'std::size_t
{aka long unsigned int}'
return static_cast(t) * internal::hash_multiplier;

Ich habe versuchen Sie einige Lösungen wie folgt, aber es funktioniert nicht:

template <typename T> 
inline bool operator==(const std::weak_ptr<T>& t, const std::weak_ptr<T>& u) 
{ 
    return !t.owner_before(u) && !u.owner_before(t); 
} 
So

, wie es funktionieren kann, bitte helfen ....

+2

** Ungeordnete ** Karte ist keine Karte und erfordert eine Hash-Funktion. Sie sollten auch eine [mcve] zur Verfügung stellen –

Antwort

0

Sie benötigen eine Hash-Funktion für std::weak_ptr zu definieren. Sie können the example in Tests für die TBB-Bibliothek finden.