Re: Compile error on templated STL map class
JetSet Willy <mars71@gmail.com>, on 10/08/2010 08:26:42, wrote:
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;
}
//-------
--
FSC - http://userscripts.org/scripts/show/59948
http://fscode.altervista.org - http://sardinias.com