Thread overview
allocators and the vc6-stl
Aug 15, 2003
Marc Kamradt
Aug 15, 2003
Marc Kamradt
Aug 16, 2003
Matthew Wilson
Aug 17, 2003
Marc Kamradt
Aug 20, 2003
Matthew Wilson
August 15, 2003
Hi!

I was just trying to use the stlsoft::malloc_allocator with the std::map from the Visual C++ 6.0 compiler. This brought up a compile error and I was wondering if anyone has an idea if that is an error on my side or maybe an incompability issue.

Here is the error:

c:\programme\microsoft visual studio\vc98\include\xtree(587) : error C2664:
'void __thiscall stlsoft::new_allocator<struct
gtl::CMemoryTracker::SMemoryInfo>::deallocate(struct
gtl::CMemoryTracker::SMemoryInfo *,unsigned int)' : Konvertierung des Par
ameters 1 von 'struct std::_Tree<int,struct std::pair<int const ,struct
gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct
gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class
stlsoft::new_allocator<struct gtl::CMemoryTracker::SMem
oryInfo> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
gtl::CMemoryTracker::SMemoryInfo> >::_Node *' in 'struct
gtl::CMemoryTracker::SMemoryInfo *' nicht moeglich
        Die Typen, auf die verwiesen wird, sind nicht verwandt; die
Konvertierung erfordert einen reinterpret_cast-Operator oder eine
Typumwandlung im C- oder Funktionsformat
        c:\programme\microsoft visual studio\vc98\include\xtree(587) : Bei
der Kompilierung der Member-Funktion 'void __thiscall std::_Tree<int,struct
std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct
std::map<int,struct gtl::CMem
oryTracker::SMemoryInfo,struct std::less<int>,class
stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
>::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
gtl::CMemoryTracker::SMemoryInfo> >::_Freenode(struct std::_Tree<in t,struct std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
>::_Kfn,struct std::less<i
nt>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
>::_Node *)' der Klassenvorlage

Here is the code line from the Visual C++ 6.0 _Tree implementation that causes the problem:

void _Freenode(_Nodeptr _S) {allocator.deallocate(_S, 1); }

Regards,

Marc Kamradt


August 15, 2003
In case you are wondering. I was trying to see if the error also occurs when I use the new_allocator. The error is the same with the new_allocator and the malloc_allocator.

Regards,

Marc Kamradt




"Marc Kamradt" <marc@spieleentwickler.org> schrieb im Newsbeitrag news:bhjeb3$77f$1@digitaldaemon.com...
> Hi!
>
> I was just trying to use the stlsoft::malloc_allocator with the std::map from the Visual C++ 6.0 compiler. This brought up a compile error and I
was
> wondering if anyone has an idea if that is an error on my side or maybe an incompability issue.
>
> Here is the error:
>
> c:\programme\microsoft visual studio\vc98\include\xtree(587) : error
C2664:
> 'void __thiscall stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo>::deallocate(struct
> gtl::CMemoryTracker::SMemoryInfo *,unsigned int)' : Konvertierung des Par
> ameters 1 von 'struct std::_Tree<int,struct std::pair<int const ,struct
> gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct
> gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMem
> oryInfo> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Node *' in 'struct
> gtl::CMemoryTracker::SMemoryInfo *' nicht moeglich
>         Die Typen, auf die verwiesen wird, sind nicht verwandt; die
> Konvertierung erfordert einen reinterpret_cast-Operator oder eine
> Typumwandlung im C- oder Funktionsformat
>         c:\programme\microsoft visual studio\vc98\include\xtree(587) : Bei
> der Kompilierung der Member-Funktion 'void __thiscall
std::_Tree<int,struct
> std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct
> std::map<int,struct gtl::CMem
> oryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Freenode(struct std::_Tree<in t,struct std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<i
> nt>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Node *)' der Klassenvorlage
>
> Here is the code line from the Visual C++ 6.0 _Tree implementation that causes the problem:
>
> void _Freenode(_Nodeptr _S) {allocator.deallocate(_S, 1); }
>
> Regards,
>
> Marc Kamradt
>
>


August 16, 2003
Marc

Hmm ... surprised but not shocked.

I'm planning to release 1.6.5 next week, so will have it sorted by then.

Sorry for the inconvenience.

Cheers

Matthew


-- 
Matthew Wilson

STLSoft moderator and C++ monomaniac

mailto:matthew@stlsoft.org
http://www.stlsoft.org
news://news.digitalmars.com/c++.stlsoft

"I can't sleep nights till I found out who hurled what ball through what apparatus" -- Dr Niles Crane

----------------------------------------------------------------------------
---

"Marc Kamradt" <marc@spieleentwickler.org> wrote in message news:bhjeb3$77f$1@digitaldaemon.com...
> Hi!
>
> I was just trying to use the stlsoft::malloc_allocator with the std::map from the Visual C++ 6.0 compiler. This brought up a compile error and I
was
> wondering if anyone has an idea if that is an error on my side or maybe an incompability issue.
>
> Here is the error:
>
> c:\programme\microsoft visual studio\vc98\include\xtree(587) : error
C2664:
> 'void __thiscall stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo>::deallocate(struct
> gtl::CMemoryTracker::SMemoryInfo *,unsigned int)' : Konvertierung des Par
> ameters 1 von 'struct std::_Tree<int,struct std::pair<int const ,struct
> gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct
> gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMem
> oryInfo> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Node *' in 'struct
> gtl::CMemoryTracker::SMemoryInfo *' nicht moeglich
>         Die Typen, auf die verwiesen wird, sind nicht verwandt; die
> Konvertierung erfordert einen reinterpret_cast-Operator oder eine
> Typumwandlung im C- oder Funktionsformat
>         c:\programme\microsoft visual studio\vc98\include\xtree(587) : Bei
> der Kompilierung der Member-Funktion 'void __thiscall
std::_Tree<int,struct
> std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct
> std::map<int,struct gtl::CMem
> oryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Freenode(struct std::_Tree<in t,struct std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<i
> nt>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Node *)' der Klassenvorlage
>
> Here is the code line from the Visual C++ 6.0 _Tree implementation that causes the problem:
>
> void _Freenode(_Nodeptr _S) {allocator.deallocate(_S, 1); }
>
> Regards,
>
> Marc Kamradt
>
>


August 17, 2003
Great! I'll give it another try with the next release.

Regards,

Marc



"Matthew Wilson" <matthew@stlsoft.org> schrieb im Newsbeitrag news:bhl012$23kp$1@digitaldaemon.com...
> Marc
>
> Hmm ... surprised but not shocked.
>
> I'm planning to release 1.6.5 next week, so will have it sorted by then.
>
> Sorry for the inconvenience.
>
> Cheers
>
> Matthew
>
>
> -- 
> Matthew Wilson
>
> STLSoft moderator and C++ monomaniac
>
> mailto:matthew@stlsoft.org
> http://www.stlsoft.org
> news://news.digitalmars.com/c++.stlsoft
>
> "I can't sleep nights till I found out who hurled what ball through what apparatus" -- Dr Niles Crane
>
> --------------------------------------------------------------------------
--
> ---
>
> "Marc Kamradt" <marc@spieleentwickler.org> wrote in message news:bhjeb3$77f$1@digitaldaemon.com...
> > Hi!
> >
> > I was just trying to use the stlsoft::malloc_allocator with the std::map from the Visual C++ 6.0 compiler. This brought up a compile error and I
> was
> > wondering if anyone has an idea if that is an error on my side or maybe
an
> > incompability issue.
> >
> > Here is the error:
> >
> > c:\programme\microsoft visual studio\vc98\include\xtree(587) : error
> C2664:
> > 'void __thiscall stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>::deallocate(struct gtl::CMemoryTracker::SMemoryInfo *,unsigned int)' : Konvertierung des
Par
> > ameters 1 von 'struct std::_Tree<int,struct std::pair<int const ,struct
> > gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct
> > gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class
> > stlsoft::new_allocator<struct gtl::CMemoryTracker::SMem
> > oryInfo> >::_Kfn,struct std::less<int>,class
stlsoft::new_allocator<struct
> > gtl::CMemoryTracker::SMemoryInfo> >::_Node *' in 'struct
> > gtl::CMemoryTracker::SMemoryInfo *' nicht moeglich
> >         Die Typen, auf die verwiesen wird, sind nicht verwandt; die
> > Konvertierung erfordert einen reinterpret_cast-Operator oder eine
> > Typumwandlung im C- oder Funktionsformat
> >         c:\programme\microsoft visual studio\vc98\include\xtree(587) :
Bei
> > der Kompilierung der Member-Funktion 'void __thiscall
> std::_Tree<int,struct
> > std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct
> > std::map<int,struct gtl::CMem
> > oryTracker::SMemoryInfo,struct std::less<int>,class
> > stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> > >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> > gtl::CMemoryTracker::SMemoryInfo> >::_Freenode(struct std::_Tree<in t,struct std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> > >::_Kfn,struct std::less<i
> > nt>,class stlsoft::new_allocator<struct
gtl::CMemoryTracker::SMemoryInfo>
> > >::_Node *)' der Klassenvorlage
> >
> > Here is the code line from the Visual C++ 6.0 _Tree implementation that causes the problem:
> >
> > void _Freenode(_Nodeptr _S) {allocator.deallocate(_S, 1); }
> >
> > Regards,
> >
> > Marc Kamradt
> >
> >
>
>


August 20, 2003
Ok, here're the problems:

- The VC++ 6 (and prev) STLs need for the first parameter to an allocator's deallocate() to be void *, not T*. So I've fixed that by having it be of type deallocate_pointer, which is defined appropriately in all allocator classes.

- The VC++ 6 (and prev) STLs assume the presence of a _Charalloc() member,
which has the semantics of a single-parameter allocate(), and which returns
char *. I've added a conditionally compiled function into all allocator
classes.

- As it transpires, the DMC/SGI requires that the allocate() and deallocate() methods are static, so I've added that into all classes as well, except winstl::shell_allocator as it has a member pointer to the shell allocator (even though this has been the COM task allocator since about Win98 / NT4 sp ??).

These changes will be in 1.6.5, which I'm hoping to release this week. There's a lot of repeated crufty stuff here, and so I plan to factor all but the mem-api-specific stuff into a base template, which all specific classes will share, for 1.7.1

btw, please note that VC6 and prior do not implement the fourth template param of map correcty. It should be

  new_allocator<pair<const int, int> > (substitute your allocator type here)

but is

 new_allocator<int>

There's nothing I can do to help here, I'm afraid, but there's a simple example in ./test/stlsoft/allocator_test2/allocator_test2.cpp in the next release which shows the ifdef-ing necessary to get a portable solution.

Cheers

Matthew

"Marc Kamradt" <marc@spieleentwickler.org> wrote in message news:bhjeb3$77f$1@digitaldaemon.com...
> Hi!
>
> I was just trying to use the stlsoft::malloc_allocator with the std::map from the Visual C++ 6.0 compiler. This brought up a compile error and I
was
> wondering if anyone has an idea if that is an error on my side or maybe an incompability issue.
>
> Here is the error:
>
> c:\programme\microsoft visual studio\vc98\include\xtree(587) : error
C2664:
> 'void __thiscall stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo>::deallocate(struct
> gtl::CMemoryTracker::SMemoryInfo *,unsigned int)' : Konvertierung des Par
> ameters 1 von 'struct std::_Tree<int,struct std::pair<int const ,struct
> gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct
> gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMem
> oryInfo> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Node *' in 'struct
> gtl::CMemoryTracker::SMemoryInfo *' nicht moeglich
>         Die Typen, auf die verwiesen wird, sind nicht verwandt; die
> Konvertierung erfordert einen reinterpret_cast-Operator oder eine
> Typumwandlung im C- oder Funktionsformat
>         c:\programme\microsoft visual studio\vc98\include\xtree(587) : Bei
> der Kompilierung der Member-Funktion 'void __thiscall
std::_Tree<int,struct
> std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct
> std::map<int,struct gtl::CMem
> oryTracker::SMemoryInfo,struct std::less<int>,class
> stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<int>,class stlsoft::new_allocator<struct
> gtl::CMemoryTracker::SMemoryInfo> >::_Freenode(struct std::_Tree<in t,struct std::pair<int const ,struct gtl::CMemoryTracker::SMemoryInfo>,struct std::map<int,struct gtl::CMemoryTracker::SMemoryInfo,struct std::less<int>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Kfn,struct std::less<i
> nt>,class stlsoft::new_allocator<struct gtl::CMemoryTracker::SMemoryInfo>
> >::_Node *)' der Klassenvorlage
>
> Here is the code line from the Visual C++ 6.0 _Tree implementation that causes the problem:
>
> void _Freenode(_Nodeptr _S) {allocator.deallocate(_S, 1); }
>
> Regards,
>
> Marc Kamradt
>
>