$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Robert Ramey (ramey_at_[hidden])
Date: 2005-09-15 11:47:29
David Abrahams wrote:
>> By arranging things so that the serialize(..) template was allways
>> called from within the boost::serialization namespace I thought I
>> had fixed the problem by permiting the overloads to be found via
>> ordinary lookup.
>
> Ordinary lookup doesn't look forward from the template's point of
> definition. But I guess you know that by now.
I would call your attention to the code in serialization.hpp - line 108
"layer 3". I believe that this code actually considered this problem. By
using an argument from the boost::serialzation namespace It guarenteed that
the correct overload would be found on the second phase of two phase lookup
on compilers supporting ADL (all those that implement two-phase lookup). If
I remember correctly, I also studied the rules that governed the conversion
from boost::serialization::version_type to const unsigned integer and this
information was used to make the process work. I left the note you see in
the documentation. This resolved the compilation errors I was having with
compilers which implement two-phase lookup so naturally I took this a
confirmation that I understood the details. Unfortunately it was some time
ago and and after I thought I resolved the problems generated by two-phase
lookup I moved on to other problems. So I thought I understood it. Of
course now I'm not so sure. I forgot the details of my solution but did
remember the amount of detail I had to plow through.
> It's hard for me to feel very sympathetic. You have the online
> compiler.
I don't think its practical to use the online compiler to compile code that
requires scores of files.
> You could find out what the switches are (--no-microsoft
> and/or --no-microsoft-bugs) to turn on 2-phase lookup on your local
> installation of comeau and do some experiments.
I can and I will. I had no reason to suppose that it was turned off for
boost (presumably in the toolset). I just assumed that build tools would be
setup to maximize compiler conformance with the standard. Perhaps
presumptuous on my part but I have to make some reasonable assumptions or
I'll never get anything done.
>> Maybe there is a real simple solution here.
>
> That's what I've been trying to tell you. As I wrote,
>
> Not much more than a small tweak in emphasis would be required.
>
>> The relevent passage in the
>> documentation currently states:
>> Namespaces for Free Function Overrides
>> For maximum portability, include any free functions templates and
>> definitions in the namespace boost::serialization. If portability is
>> not a concern and the compiler being used supports ADL (Argument
>> Dependent Lookup) the free functions and templates can be in any of
>> the following namespaces: a.. boost::serialization
>> b.. namespace of the archive class
>> c.. namespace of the type being serialized
>> So if I were to change it to the following would that be
>> satisfactory? Namespaces for Free Function Overrides
>
>> If your compiler supports two-phase lookup and ADL (Argument
>> Dependent Lookup) the free functions and templates can be in any of
>> the following namespaces:
>>
>> namespace of the archive class
>> namespace of the type being serialized
>
> Good, but you should be specific about which free functions and
> templates you're talking about.
>
>> If your compiler doesn't support two-phase lookup but it does
>> support ADL free functions and templates can be in any of the
>> following namespaces a.. boost::serialization
>> b.. namespace of the archive class
>> c.. namespace of the type being serialized
>> If your compiler doesn't support ADL free functions and templates
>> must be in the boost::serialization namespace.
>
> well, at least that's almost correct. The associated namespaces of a
> type can be more than the one its defined in, but that's OK. I think
> it's more complicated than it needs to be; I'd say
>
> if your compiler supports argument dependent lookup, overload
> serialize in the namespace of the type being serialized;
> otherwise, overload serialize in boost::serialization
>
>> Of course that begs the main question I set out to answer. How to
>> make ones code work on all boost platforms
>
> I showed you how in this very message. And that's a repetition of
> something I showed you earlier.
>
>> - but we can just leave that to the judgement of the library user.
>
> That would still be a big improvement on the status quo.
OK I'll just make this alteration in that section. Halleluhuh
Robert Ramey.