15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Standard Template Library maps with CString Keys

Richard Bothne -- rbothne@qntm.com
Monday, February 12, 1996

Hi,

I'm trying to use STL with MFC. For the most part everything works fine. I
cannot however get a STL map to work using CString keys. The code is as follows:

#define NOMINMAX
#include 
#include 

namespace std {
#include "map.h"
}

int main()
{
    std::map > m;

    return 0;
}

and the error I get is:

D:\C\Delete\function.h(102) : error C2678: binary '<' : no operator defined
which takes a left-hand operand of type 'const class CString' (or there is
no acceptable conversion) (new behavior; please see help)

Note:
 I've modified the STL header files as specified in the Docs with VC4.0

Thanks for you help,

Richard
____________________________________________________________________
I used to have a really neat signature file, but I lost it somewhere




Mark Kramer -- mkram@msn.com
Wednesday, February 14, 1996

[Mini-digest: 4 responses]

Richard -

A quick look at afx.h and the CString class along with its accompanying helper 
functions should give you a clue. I don't see the operator<() defined that the 
compiler is looking for either. Maybe you could define one yourself.

Mark

-----From: "David W. Bickford" 

Hi,

In response to "Standard Template Library maps with CString Keys"

I've been using the STL with MFC for quite some time. I too had this =
problem about 3 months ago. I don't know the exact reason why but your =
code works fine on my machine. I can only offer two possible =
explanations:

1)  You need to upgrade your copy of the STL from =
ftp.cs.rpi.edu/pub/stl. The version that comes with Visual C++ 4.0 was =
upgraded on October 31st.=20
2)  Try dropping the namespace and the code changes, despite the readme. =
I haven't encountered any of those so called incompatibilities. Your =
code works fine.

If anyone encounters further problems or has comments with regard to the =
STL please drop me a note at bickford@ic.net, especially if you can show =
me a code sample that has an incompatibility with MFC.

	Dave


-----From: Tim Hagemann <100063.323@compuserve.com>

Hi Richard,

>> I'm trying to use STL with MFC. For the most part everything works fine. I
>> cannot however get a STL map to work using CString keys. The code is as
follows:

I eleminated the error by putting the following declaration in the stdafx.h
header file:

namespace std
{
	bool operator<(const CString &s1, const CString &s2)
	{
		return s1 < s2;
	}
}

Hope this helps ! 

Tim Hagemann


PS: I got several link errors, see my other message.

-----From: Neil Cook 

> D:\C\Delete\function.h(102) : error C2678: binary '<' : no operator defined
> which takes a left-hand operand of type 'const class CString' (or there is
> no acceptable conversion) (new behavior; please see help)
> 

Richard, the message says that you need to define operator '<' for the 
const class CString. If you define one, the message should go away.

When using types which are not part of the language with templates, you will 
often have to define such operators.

/Neil



bop@gandalf.se
Wednesday, February 14, 1996

>From Richard Bothne  
> Hi,
>
> I'm trying to use STL with MFC. For the most part everything works fine. I
> cannot however get a STL map to work using CString keys. The code is as
> follows:
>
> #define NOMINMAX
> #include 
> #include 
>
> namespace std {
> #include "map.h"
> }
>
> [snip]

The documentation mentions that CString will conflict with
the STL libarary. The work around is not correct though...

Some of the .h-files in the STL library actually includes standard
C files, like "stdlib.h". The way you coded (i.e. according to
Microsofts hint!) these includes will ALSO be placed in the
namespace "std".

The way to do it, is to edit ALL the  STL files (sigh), and place a line

namespace std {

AFTER their includes, and a matching brace at the end of the
file.


Bo Persson
bop@gandalf.se



Peter J Brock -- Peter.Brock@btal.com.au
Monday, February 19, 1996

[Mini-digest: 3 responses]

At 22:46 14/02/96 +0100, you wrote:
>>From Richard Bothne  
>> Hi,
>>
>> I'm trying to use STL with MFC. For the most part everything works fine. I
>> cannot however get a STL map to work using CString keys. The code is as
>> follows:
>>
>> #define NOMINMAX
>> #include 
>> #include 
>>
>> namespace std {
>> #include "map.h"
>> }
>>
>> [snip]
>
>The documentation mentions that CString will conflict with
>the STL libarary. The work around is not correct though...
>
>Some of the .h-files in the STL library actually includes standard
>C files, like "stdlib.h". The way you coded (i.e. according to
>Microsofts hint!) these includes will ALSO be placed in the
>namespace "std".
>
>The way to do it, is to edit ALL the  STL files (sigh), and place a line
>
>namespace std {
>
>AFTER their includes, and a matching brace at the end of the
>file.
>
>
>Bo Persson
>bop@gandalf.se
>
>

I have not tried this but, Terris Linenbach has had success.
Check out his home page.

Home page of Terris Linenbach who has modified the STL provided 
with the Microsoft Visual C++ 4.0. His modifications are available 
from ftp://ftp.rahul.net/pub/terris/stl.zip The code is unique 
in that it allows STL to work with CString. Microsoft have a 
paper on MFC and Standard Template Library (STL) 


BTW My home page which is still evolving (and will continue
to evolve for the next couple of months) has useful links 
regarding the Standard Template Library. 
http://www.magna.com.au/~peter


Cheers
____________________________________________________________________
Peter J Brock

Senior Analyst/Programmer              voice: +61 2 259 3365
Bankers Ttrust Australia Limited       fax  : +61 2 259 9486
                                       email: Peter.Brock@btal.com.au

Level 2, Chifley Tower, Chifley Square, Sydney NSW 2000, AUSTRALIA				
____________________________________________________________________



-----From: Mario Contestabile 

>The documentation mentions that CString will conflict with
>the STL libarary. The work around is not correct though...

MSVCs documentation? I haven't found any mention of CString problems
with STL and MFC.  I have used CStrings in an STL map.

>Some of the .h-files in the STL library actually includes standard
>C files, like "stdlib.h". The way you coded (i.e. according to
>Microsofts hint!) these includes will ALSO be placed in the
>namespace "std".
>The way to do it, is to edit ALL the  STL files (sigh), and place a line
>
>namespace std {
>
>AFTER their includes, and a matching brace at the end of the
>file.

The appropriate method for using STL with MFC is to simply #include "stl.h"
in your source. The stl.h file must #include EVERY standard header which the 
stl files #include.
For example.

#define NOMINMAX
#include 
#include 
#include 

namespace std{
 #include 
}

Modification of every stl header file is not necessary.
mcontest@universal.com

-----From: "David W. Bickford" 

I too arrived at this decision. However, I now believe the readme is =
worse than that.  I've been combining the STL with CStrings for months =
without a namespace. When I walk through the code in the debugger all =
the appropriate CString global function operators get called. After all =
they take precedence over global templates... Try dispensing with the =
namespace, if you have any problems I'd love to hear about them.

	Dave Bickford (bickford@ic.net)





| Вернуться в корень Архива |