Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations MikeeOK on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

template trick for debug amateurs

Status
Not open for further replies.

LDdA

Programmer
Apr 18, 2003
2
FR
Hi

I'm stuck with this template error, I really don't understand what's going on:

my error message:
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_hashtable.h: In method `size_t hashtable<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image>,basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,hash<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,_Select1st<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image> >,equal_to<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,allocator<Magick::Image> >::_M_bkt_num_key(const string &, unsigned int) const':
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_hashtable.h:521: instantiated from `hashtable<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image>,basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,hash<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,_Select1st<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image> >,equal_to<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,allocator<Magick::Image> >::_M_bkt_num_key(const string &) const'
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_hashtable.h:460: instantiated from `hashtable<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image>,basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,hash<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,_Select1st<pair<const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image> >,equal_to<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,allocator<Magick::Image> >::find(const string &)'
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_hash_map.h:176: instantiated from `hash_map<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,Magick::Image,hash<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,equal_to<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >,allocator<Magick::Image> >::find(const string &)'
CacheSystem/CacheFifo.hpp:109: instantiated from `CacheSystem::CacheFifo<Magick::Image,basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >,loader::Loader<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > > >::getImageObject(string &)'
Main.cpp:26: instantiated from here
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_hashtable.h:531: no match for call to `(const hash<basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > >) (const basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > &)'



And my code:
template<class T, class K, class L>
class CacheFifo {
hash_map<K, T, hash<K> > _image_set;
...
T getImageObject(K &key) throw (NotEnoughSpaceException,
RemovalImpossibleException){
l109---> hash_map<K, T, hash<K> >::iterator index = (this->_image_set).find(key);
return 0;
}
};//end class

And I call this method here:
string file_name = string(argv[1]);
CacheFifo<Image, string, Loader<string> > cache = CacheFifo<Image, string, Loader<string> >(l);
Image pic = cache.getImageObject(file_name);


I acknowledge, it's a bit horrible. It seems as if find() goes wrong. When I comment the line with --->, everything goes well.

I thank you very much if you spend some time on my problem

LDdA
 
My first guess would be:

There is no hash<string> implementation!
You have to write your own version of a string hash. That's probably why your class cannot be instantiated.

write a template specialization for string:
Code:
namespace __gnu_cxx {
template <> class hash< std::string >
{
public:
        size_t operator()( const std::string& key ) const
        {
                int l = key.length();
                size_t value = 0;
                while( l-- )
                {
                        value = 5 * value + key[ l ];
                }

                return value;
        }
};

} // namespace __gnu_cxx

Whether or not you have to use the __gnu_cxx namespace depends on where (which namespace) class hash is defined in your installation of the STL.

Regards,
Tobi
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top