Compile error on templated STL map class


J

JetSet Willy

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>::eek:perator ()(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>::eek:perator ()(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 said:
,int>,long,std::pair<const int,int> *,std::pair<const int,int>
,std::pair<const
std::basic_string said:
,int>,std::basic_string<char,std::char_traits<char>,std::allocator<char>
,__rw::__select1st<std::pair<const

__rw::__rb_tree said:
,std::pair<const
std::basic_string said:
,int>,__rw::__select1st<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) { }
^^^^^^^^^^^
 
Ad

Advertisements

F

Francesco S. Carta

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?

For what is worth, I am not able to see any problem with the code you
posted. Maybe it's some aCC oddity.

MinGW 4.4.0 compiles and runs it fine, producing this output:

Inside FloeLog::init(), about to do _logTypeMap.insert()

Also Comeau Online swallows it without any error.

This is the code I compiled, practically identical to yours - I just
merged the two files together:

//-------

#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;
}


//#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;
}


//-------
 
B

Bart van Ingen Schenau

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?
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;

Based on the error messages, I get a strong feeling that aCC is seeing
that last declaration as
map<C1, C1> _map2;

Are you sure that GCC and aCC are being fed the exact same code? And
that the code we see here is copy/pasted from that same source (not
retyped)?

Bart v Ingen Schenau
 
Ad

Advertisements

A

arjunaw

Based on the error messages, I get a strong feeling that aCC is seeing
that last declaration as
  map<C1, C1> _map2;

Are you sure that GCC and aCC are being fed the exact same code? And
that the code we see here is copy/pasted from that same source (not
retyped)?

Bart v Ingen Schenau

Others have seen the exact same issue. It appears to be a bug in
versions of aCC prior to version A.03.35:
http://software.itags.org/linux-unix/243203/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top