From: JetSet Willy on 11 Aug 2010 22:08 I have a class template (ExclusiveMap) which takes two type parameters C1 and C2 and declares two private members map<C1, C2> and map<C2, C1> (both STL maps). In test code I instantiate this class template providing types int and string for C1 and C2 respectively. The test code compiles cleanly using GCC 3.2 however when I pass it through HPUX aCC I get error messages about the inability to convert strings to ints. I can appreciate that aCC might be stricter than GCC in certain aspects however I cannot understand how GCC would compile and link it with no errors or warnings resulting in an executable that actually does what I want whereas aCC quits with errors, not just warnings. Can anyone see what might be causing aCC to require conversion from string to int in the code below? test.cc: ===== #include <ExclusiveMap.h> #include <string> #include<iostream> using namespace std; class FloeLog { public: void init(); private: ExclusiveMap<int, string> _logTypeMap; // aCC does not seem to like // ExclusiveMap<int, int> _logTypeMap; // No compile errors }; // class FloeLog void FloeLog::init() { cout << "Inside FloeLog::init(), about to do _logTypeMap.insert() \n"; _logTypeMap.insert(12, "FLOE_EVENT"); // _logTypeMap.insert(12, 13); // No compile errors } int main() { FloeLog FL; FL.init(); return 0; } ExclusiveMap.h: ============ #include <map> using namespace std; template <class C1, class C2> class ExclusiveMap { public: ExclusiveMap(); bool insert(const C1& c1, const C2& c2); private: map<C1, C2> _map1; map<C2, C1> _map2; }; template <class C1, class C2> ExclusiveMap<C1, C2>::ExclusiveMap() { } template <class C1, class C2> bool ExclusiveMap<C1, C2>::insert(const C1& c1, const C2& c2) { typename map<C1, C2>::iterator map1Iter = _map1.find(c1); typename map<C2, C1>::iterator map2Iter = _map2.find(c2); // This causes compile error when using HP aCC if (map1Iter == _map1.end() && map2Iter == _map2.end()) { _map2[c2] = c1; _map1[c1] = c2; return true; } return false; } % g++ -g -I. test.cc <compiles and links without errors> % /opt/aCC/bin/aCC -AA -c -g -I. test.cc Error 226: "/opt/aCC-3.30.01/include_std/rw/tree.cc", line 492 # No appropriate function found for call of 'operator ()'. Last viable candidate was "bool std::less<int>::operator ()(const int &,const int &) const" ["/opt/aCC-3.30.01/include_std/functional", line 167]. Argument of type 'const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &' could not be converted to 'const int &'. if (!_C_key_compare(__x->_C_key(), __k)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error 226: "/opt/aCC-3.30.01/include_std/rw/tree.cc", line 500 # No appropriate function found for call of 'operator ()'. Last viable candidate was "bool std::less<int>::operator ()(const int &,const int &) const" ["/opt/aCC-3.30.01/include_std/functional", line 167]. Argument of type 'const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &' could not be converted to 'const int &'. || _C_key_compare(__k, ((_C_tree_iter&)__j)._C_node- >_C_key())) ? e ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error 556: "./ExclusiveMap.h", line 37 # Unable to generate specialization "__rw::__rw_tree_iter<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,long,std::pair<const int,int> *,std::pair<const int,int> &,__rw::__rw_rb_tree_node<std::allocator<std::pair<const int,int> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,__rw::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > > __rw::__rb_tree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,__rw::__select1st<std::pair<const std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::less<int>,std::allocator<std::pair<const int,int> > >::find(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &)" due to errors during generation. typename map<C2, C1>::iterator map2Iter = _map2.find(c2); // This causes compile error when using HP aCC ^^^^^^^^^^^^^^ Error 440: "/opt/aCC-3.30.01/include_std/utility", line 117 # Cannot initialize 'const int' with 'const class basic_string<char,std::char_traits<char>,std::allocator<char> >'. : first (__rhs.first), second (__rhs.second) { } ^^^^^^^^^^^ -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
|
Pages: 1 Prev: copy constructor elision Next: Why does a base function hide a function in a derived class? |