rshek
asked on
Creating STL map<string, pair<string, string> >
Platform: Win95 Compiler: VC++ 4.2
I have a problem on creating the following map instance using the MS version of STL (internal error reported from the compiler):
typedef pair<string, string> PairType;
typedef map<string, PairType, ::less<string>, allocator<PairType> > MapType;
......
MapType mymap;
To experiment, I changed the types in PairType to be pair<int, int>, it at least compiles okay. But if I switch one of the int back to string, the same symptom occurs.
The following lists my test source codes:
#pragma warning( disable : 4786)
#include <map>
#include <string>
typedef pair<string, string> PairType;
typedef map<string, PairType, ::less<string>, allocator<PairType> > MapType;
static void do_test();
int
main()
{
do_test();
return 0;
}
static void
do_test()
{
string key1("key1"), key2("key999");
string data1("data1"), data2("data2"), data3("data3"), data4("data4");
MapType mymap;
mymap[key1] = PairType(data1, data2);
}
I have a problem on creating the following map instance using the MS version of STL (internal error reported from the compiler):
typedef pair<string, string> PairType;
typedef map<string, PairType, ::less<string>, allocator<PairType> > MapType;
......
MapType mymap;
To experiment, I changed the types in PairType to be pair<int, int>, it at least compiles okay. But if I switch one of the int back to string, the same symptom occurs.
The following lists my test source codes:
#pragma warning( disable : 4786)
#include <map>
#include <string>
typedef pair<string, string> PairType;
typedef map<string, PairType, ::less<string>, allocator<PairType> > MapType;
static void do_test();
int
main()
{
do_test();
return 0;
}
static void
do_test()
{
string key1("key1"), key2("key999");
string data1("data1"), data2("data2"), data3("data3"), data4("data4");
MapType mymap;
mymap[key1] = PairType(data1, data2);
}
ASKER
We don't need to use the namespace std at all. MS version of STL already takes care of it. If the HP version is used, which it wasn't in this case and we'll not consider to use, then an explicit namespace is required.
Please notice the following points in my original question:
1. Changing pair<string, string> to pair<int, int> will work. So it is definitely not a namespace problem.
2. The map key and both the elements in the pair are of the same data type, i.e. string. I keep wondering whether it is not "allowed" to have the data and the key to be the same type (???).
The following encloses the compiler error message:
Compiling...
test_map.cpp
C:\MSDEV\INCLUDE\xtree(153 ) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'd:\backend\src\P2\main.c' , line 413)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.
Please notice the following points in my original question:
1. Changing pair<string, string> to pair<int, int> will work. So it is definitely not a namespace problem.
2. The map key and both the elements in the pair are of the same data type, i.e. string. I keep wondering whether it is not "allowed" to have the data and the key to be the same type (???).
The following encloses the compiler error message:
Compiling...
test_map.cpp
C:\MSDEV\INCLUDE\xtree(153
(compiler file 'd:\backend\src\P2\main.c'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.
Using VC++ 4.2, I have no problem compiling your source using these command lines:
cl /c /GX /O2 yourfile.cpp
cl /c /GX /Od yourfile.cpp
cl /c /GX /O1 yourfile.cpp
cl /c /GX yourfile.cpp
please tell us what command-line switches you're using to cause the internal compiler error message. (This is the same question you'd be asked if you called Product Support Services, as the error message requests.)
.B ekiM
cl /c /GX /O2 yourfile.cpp
cl /c /GX /Od yourfile.cpp
cl /c /GX /O1 yourfile.cpp
cl /c /GX yourfile.cpp
please tell us what command-line switches you're using to cause the internal compiler error message. (This is the same question you'd be asked if you called Product Support Services, as the error message requests.)
.B ekiM
ASKER
I have tried using the command line:
cl /c /GX yourfile.cpp
and it works. BUT, to compile it in the Developer Studio it doesn't. However, the program compiles ok in Release settings (but I do require a debug version).
The followings are the project settings:
For debug settings: in C/C++ tab:
/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /Fp"Debug/test_map.pch" /YX /Fo"Debug/" /Fd"Debug/" /c
For release settings: in C/C++ tab:
/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/test_map.pch" /YX /Fo"Release/" /c
cl /c /GX yourfile.cpp
and it works. BUT, to compile it in the Developer Studio it doesn't. However, the program compiles ok in Release settings (but I do require a debug version).
The followings are the project settings:
For debug settings: in C/C++ tab:
/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /Fp"Debug/test_map.pch" /YX /Fo"Debug/" /Fd"Debug/" /c
For release settings: in C/C++ tab:
/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/test_map.pch" /YX /Fo"Release/" /c
The code you've provided here still does't cause an ICE with either of the option sets that you've provided. I'm not using the /Fp option you've provided, of course, since I don't have the code you're using to generate your PCH file.
This strongly suggests that the problem is because of some code that you still haven't shared with us.
.B ekiM
This strongly suggests that the problem is because of some code that you still haven't shared with us.
.B ekiM
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks for your answer, snemanov. I fact, if I remove the /Zi or /Z7, which flag to generate debug info, the code will compile but I won't be able to debug the code.
Indeed, I got round the problem by declaring a new class and build up a vector of the class instance.
Indeed, I got round the problem by declaring a new class and build up a vector of the class instance.
forgot to put
using namespace std;
after the #includes.