423,323 Members | 1,789 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 423,323 IT Pros & Developers. It's quick & easy.

Compile error on templated STL map class

P: 4
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:
=====

Expand|Select|Wrap|Line Numbers
  1. #include <ExclusiveMap.h>
  2. #include <string>
  3. #include<iostream>
  4. using namespace std;
  5.  
  6. class FloeLog
  7. {
  8.  
  9. public:
  10.  
  11.     void init();
  12.  
  13. private:
  14.  
  15.      ExclusiveMap<int, string>  _logTypeMap;  // aCC does not seem to like
  16. //    ExclusiveMap<int, int>  _logTypeMap;  // No compile errors
  17.  
  18. }; // class FloeLog
  19.  
  20. void FloeLog::init()
  21. {
  22.     cout << "Inside FloeLog::init(), about to do _logTypeMap.insert()\n";
  23.  
  24.       _logTypeMap.insert(12, "FLOE_EVENT");
  25. //    _logTypeMap.insert(12, 13); // No compile errors
  26.  
  27. }
  28.  
  29. int main()
  30. {
  31.  
  32. FloeLog FL;
  33.  
  34. FL.init();
  35.  
  36. return 0;
  37.  
  38. }
ExclusiveMap.h:
============
Expand|Select|Wrap|Line Numbers
  1. #include <map>
  2. using namespace std;
  3.  
  4. template <class C1, class C2>
  5. class ExclusiveMap
  6. {
  7. public:
  8.  
  9.     ExclusiveMap();
  10.  
  11.     bool insert(const C1& c1, const C2& c2);
  12.  
  13. private:
  14.  
  15.     map<C1, C2> _map1;
  16.     map<C2, C1> _map2;
  17. };
  18.  
  19. template <class C1, class C2>
  20. ExclusiveMap<C1, C2>::ExclusiveMap()
  21. {
  22. }
  23.  
  24. template <class C1, class C2>
  25. bool
  26. ExclusiveMap<C1, C2>::insert(const C1& c1, const C2& c2)
  27. {
  28.  
  29.      typename map<C1, C2>::iterator map1Iter = _map1.find(c1);
  30.      typename map<C2, C1>::iterator map2Iter = _map2.find(c2); // This causes compile error when using HP aCC
  31.  
  32.      if (map1Iter ==  _map1.end() && map2Iter == _map2.end())
  33.      {
  34.        _map2[c2] = c1;
  35.        _map1[c1] = c2;
  36.         return true;
  37.      }
  38.     return false;
  39. }
% 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 30 # 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<cha r>,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<cha r>,std::allocator<char> > > > >
__rw::__rb_tree<std::basic_string<char,std::char_t raits<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<cha r>,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::allo cator<char> >'.
: first (__rhs.first), second (__rhs.second) { }
^^^^^^^^^^^
Aug 11 '10 #1
Share this Question
Share on Google+
7 Replies


100+
P: 687
Apparently this compiler's library lacks 'operator <' for std::string, so it can't be used as map key without defining comparer. Does
Expand|Select|Wrap|Line Numbers
  1.  std::string a,b;
  2. a<b;
  3.  
compile?
Aug 11 '10 #2

P: 4
Thanks for your reply. I agree that the error messages do suggest so. A quick test along the lines you've outlined however shows that the '<' operator does indeed exist for std::string (i.e. aCC compiles your code snippet w/o error).

I trimmed my original code down to its barest minimum such that aCC still errors out on it complaining about type mismatches (while g++ still compiles it fine).

Test.cc:

Expand|Select|Wrap|Line Numbers
  1. #include <map>
  2. #include <string>
  3. using namespace std;
  4.  
  5. template <class C1, class C2>
  6. class ExclusiveMap
  7. {
  8.     map<C1, C2> _map1;
  9.     map<C2, C1> _map2;
  10. };
  11.  
  12. class FloeLog
  13. {
  14.  
  15.      ExclusiveMap<int, string>  _logTypeMap;  
  16. //   ExclusiveMap<string, int>  _logTypeMap2;  
  17. };
  18.  
  19.  
  20. int main()
  21. {
  22.  
  23. FloeLog FL;
  24. return 0;
  25.  
% g++ -g -I. Test.cc
<compiles and links without errors>

% /opt/aCC/bin/aCC -AA -g -I. Test.cc
Error (future) 212: "/opt/aCC-3.30.01/include_std/rw/tree", line 454 # Argument type 'const std::pair<const int,int> *' does not match
expected parameter type 'std::pair<const int,int> *'.
_RWSTD_VALUE_ALLOC
^^^^^^^^^^^^^^^^^^
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::allo cator<char> >'.
: first (__rhs.first), second (__rhs.second) { }
^^^^^^^^^^^
Error 445: "Test.cc", line 20 # Cannot recover from earlier errors.
int main()
^^^^^^^^^^


If I swap the order of passing types <int, string> to be <string, int> like this:

Test.cc:

Expand|Select|Wrap|Line Numbers
  1. #include <map>
  2. #include <string>
  3. using namespace std;
  4.  
  5. template <class C1, class C2>
  6. class ExclusiveMap
  7. {
  8.     map<C1, C2> _map1;
  9.     map<C2, C1> _map2;
  10. };
  11.  
  12. class FloeLog
  13. {
  14.  
  15. //    ExclusiveMap<int, string>  _logTypeMap;  
  16.       ExclusiveMap<string, int>  _logTypeMap2;  
  17. };
  18.  
  19.  
  20. int main()
  21. {
  22.  
  23. FloeLog FL;
  24. return 0;
  25.  
% /opt/aCC/bin/aCC -AA -g -I. Test.cc
Error (future) 212: "/opt/aCC-3.30.01/include_std/rw/tree", line 454 # Argument type 'const std::pair<const
std::basic_string<char,std::char_traits<char>,std: :allocator<char>
>,std::basic_string<char,std::char_traits<char>,st d::allocator<char> > > *' does not match expected parameter type
'std::pair<const std::basic_string<char,std::char_traits<char>,std: :allocator<char>
>,std::basic_string<char,std::char_traits<char>,st d::allocator<char> > > *'.
_RWSTD_VALUE_ALLOC
^^^^^^^^^^^^^^^^^^
Error 226: "/opt/aCC-3.30.01/include_std/utility", line 117 # No appropriate function found for call of 'basic_string::basic_string'.
Last viable candidate was "std::basic_string<char,std::char_traits<char>,std ::allocator<char> >::basic_string(const
std::allocator<char> &)" ["/opt/aCC-3.30.01/include_std/string", line 204]. Argument of type 'const int' could not be converted to
'const std::allocator<char> &'.
: first (__rhs.first), second (__rhs.second) { }
^^^^^^^^^^^
Error 445: "Test.cc", line 20 # Cannot recover from earlier errors.
int main()
^^^^^^^^^^

i.e. a slightly different error message but essentially the same thing.

Now here's the really strange thing: If I comment out the second map instantiation map<C2, C1> _map2 then aCC compiles and links Test.cc with no errors emitted.

Test.cc:

Expand|Select|Wrap|Line Numbers
  1. #include <map>
  2. #include <string>
  3. using namespace std;
  4.  
  5. template <class C1, class C2>
  6. class ExclusiveMap
  7. {
  8.     map<C1, C2> _map1;
  9. //    map<C2, C1> _map2;
  10. };
  11.  
  12. class FloeLog
  13. {
  14.  
  15.       ExclusiveMap<int, string>  _logTypeMap;  
  16.       ExclusiveMap<string, int>  _logTypeMap2;  
  17. };
  18.  
  19.  
  20. int main()
  21. {
  22.  
  23. FloeLog FL;
  24. return 0;
  25.  
% /opt/aCC/bin/aCC -AA -g -I. Test.cc
<compiles and links without errors>

Given the symmetry in that I'm instantiating two ExclusiveMap classes, one with <int, string> and the other with <string, int> you'd think that if the above compiles cleanly then so too should the following where I've commented out _map1 instead of _map2:

Test.cc:

Expand|Select|Wrap|Line Numbers
  1. #include <map>
  2. #include <string>
  3. using namespace std;
  4.  
  5. template <class C1, class C2>
  6. class ExclusiveMap
  7. {
  8. //    map<C1, C2> _map1;
  9.     map<C2, C1> _map2;
  10. };
  11.  
  12. class FloeLog
  13. {
  14.  
  15.       ExclusiveMap<int, string>  _logTypeMap; 
  16.       ExclusiveMap<string, int>  _logTypeMap2; 
  17. };
  18.  
  19.  
  20. int main()
  21. {
  22.  
  23. FloeLog FL;
  24. return 0;
  25.  
But no.

% /opt/aCC/bin/aCC -AA -g -I. Test.cc
Error (future) 212: "/opt/aCC-3.30.01/include_std/rw/tree", line 454 # Argument type 'const std::pair<const
std::basic_string<char,std::char_traits<char>,std: :allocator<char>
>,std::basic_string<char,std::char_traits<char>,st d::allocator<char> > > *' does not match expected parameter type
'std::pair<const std::basic_string<char,std::char_traits<char>,std: :allocator<char>
>,std::basic_string<char,std::char_traits<char>,st d::allocator<char> > > *'.
_RWSTD_VALUE_ALLOC
^^^^^^^^^^^^^^^^^^
Error 226: "/opt/aCC-3.30.01/include_std/utility", line 117 # No appropriate function found for call of 'basic_string::basic_string'.
Last viable candidate was "std::basic_string<char,std::char_traits<char>,std ::allocator<char> >::basic_string(const
std::allocator<char> &)" ["/opt/aCC-3.30.01/include_std/string", line 204]. Argument of type 'const int' could not be converted to
'const std::allocator<char> &'.
: first (__rhs.first), second (__rhs.second) { }
^^^^^^^^^^^
Error 445: "Test.cc", line 20 # Cannot recover from earlier errors.
int main()
^^^^^^^^^^


Needless to say I am completely baffled by what I am seeing and at this stage I can think of no other cause than a bug in aCC.

I would be very interested to hear if anyone feels otherwise - thanks.
Aug 11 '10 #3

100+
P: 687
googling for "include_std/rw/tree" makes me think so.
http://software.itags.org/linux-unix/243203/
Aug 11 '10 #4

weaknessforcats
Expert Mod 5K+
P: 9,163
I'm probably missing the whole point but your code compiles and links using Visual Studio.NET 2008.
Aug 11 '10 #5

P: 4
@newb16 Thanks mate, I am now convinced it is a bug in the version of aCC that I'm using. Sadly I'm unable to upgrade to a more recent version.
Aug 12 '10 #6

P: 4
@weaknessforcats Yeah the problem is that HPUX aCC version A.03.31 that I'm stuck with doesn't like the code even though every other compiler seems to have no problem compiling it.
Aug 12 '10 #7

weaknessforcats
Expert Mod 5K+
P: 9,163
Visual Studio gets its STL templates from PJ Plauger at Dinkumware.

Have you checked that you are using the latest set of STL templates for your compiler?
Aug 12 '10 #8

Post your reply

Sign in to post your reply or Sign up for a free account.