J'ai implémenté ce code, mais échoue lors de la compilation (VC2008 Express Ed.):
Maintenant tout le code est ici.échoue en utilisant hash_map <vector<int>, string>, pourquoi?
#include <stdio.h>
#include <vector>
#include <string>
#include <hash_map>
using namespace std;
using namespace stdext;
typedef vector type_key;
int main(int argc, char* argv[])
{
type_key key;
hash_map<type_key, string> map_segment;
hash_map<type_key, string>::iterator iter_map_segment;
iter_map_segment = map_segment.find(key);
return 0;
}
L'utilisation de unordered_map entraîne également la même erreur. Mais le remplacement du conteneur par une erreur de carte ne se produit pas.
Que peut-on faire pour corriger?
Merci.
[edited]
info d'erreur:
------ Build started: Project: map_key_test, Configuration: Debug Win32 ------
Compiling...
map_key_test.cpp
c:\program files\microsoft visual studio 9.0\vc\include\xhash(75) : error C2440: 'type cast' : cannot convert from 'const type_key' to 'size_t'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
c:\program files\microsoft visual studio 9.0\vc\include\xhash(128) : see reference to function template instantiation 'size_t stdext::hash_value<_Kty>(const _Kty &)' being compiled
with
[
_Kty=type_key
]
c:\program files\microsoft visual studio 9.0\vc\include\xhash(127) : while compiling class template member function 'size_t stdext::hash_compare<_Kty,_Pr>::operator()(const _Kty &) const'
with
[
_Kty=type_key,
_Pr=std::less<type_key>
]
c:\program files\microsoft visual studio 9.0\vc\include\hash_map(78) : see reference to class template instantiation 'stdext::hash_compare<_Kty,_Pr>' being compiled
with
[
_Kty=type_key,
_Pr=std::less<type_key>
]
c:\program files\microsoft visual studio 9.0\vc\include\xhash(191) : see reference to class template instantiation 'stdext::_Hmap_traits<_Kty,_Ty,_Tr,_Alloc,_Mfl>' being compiled
with
[
_Kty=type_key,
_Ty=std::string,
_Tr=stdext::hash_compare<type_key,std::less<type_key>>,
_Alloc=std::allocator<std::pair<const type_key,std::string>>,
_Mfl=false
]
c:\program files\microsoft visual studio 9.0\vc\include\hash_map(88) : see reference to class template instantiation 'stdext::_Hash<_Traits>' being compiled
with
[
_Traits=stdext::_Hmap_traits<type_key,std::string,stdext::hash_compare<type_key,std::less<type_key>>,std::allocator<std::pair<const type_key,std::string>>,false>
]
c:\users\salamon\documents\visual studio 2008\projects\map_key_test\map_key_test.cpp(17) : see reference to class template instantiation 'stdext::hash_map<_Kty,_Ty>' being compiled
with
[
_Kty=type_key,
_Ty=std::string
]
Build log was saved at "file://c:\Users\Salamon\Documents\Visual Studio 2008\Projects\map_key_test\Debug\BuildLog.htm"
map_key_test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
[edited]
Solution complète:
#include <stdio.h>
#include <vector>
#include <string>
#include <hash_map>
using namespace std;
using namespace stdext;
class Vector : public vector<int>
{
public:
operator size_t() const { return (*this).size(); };
};
typedef Vector type_key;
struct less_vector
{
bool operator()(const Vector & x, const Vector & y) const
{
if (x != y)
return true;
return false;
}
};
struct greater_vector
{
bool operator()(const Vector & x, const Vector & y) const
{
if (x == y)
return true;
return false;
}
};
int main(int argc, char* argv[])
{
Vector key;
string str;
hash_map<Vector, string, hash_compare <Vector, less_vector > > map_segment;
hash_map<Vector, string, hash_compare <Vector, greater_vector > >::iterator iter_map_segment;
//
key.push_back(0);
key.push_back(1);
key.push_back(2);
str = "012";
map_segment [key] = str;
//
key.clear();
key.push_back(1);
key.push_back(0);
key.push_back(2);
str = "102";
map_segment [key] = str;
//
key.clear();
key.push_back(2);
key.push_back(1);
key.push_back(0);
str = "210";
map_segment [key] = str;
//
key.clear();
key.push_back(1);
key.push_back(0);
key.push_back(2);
iter_map_segment = map_segment.find(key);
return 0;
}
Veuillez poster le texte de l'erreur que le compilateur vous donne. Les erreurs du compilateur donnent beaucoup d'informations qui aident à déboguer le problème. De plus, il sera plus utile pour les personnes qui ont la même erreur à l'avenir et qui sont à la recherche de cette erreur. –