$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [testing] Add a tester with hidden visibility
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2015-05-07 12:39:55
On Thursday 07 May 2015 17:32:13 Niall Douglas wrote:
> On 7 May 2015 at 18:59, Andrey Semashev wrote:
> > > I have no idea why you continue to insist on trying to second guess
> > > the very well established pattern here. The design of the GCC
> > > visibility support was chosen back in 2004 to correctly support all
> > > combinations of GCC, MSVC and Mingw without any special casing,
> > > trickery, or any macro work above the traditional preprocessor logic
> > > used for MSVC.
> >
> > Well, it's not that simple. For example, if you dllexport a class template
> > and explicitly instantiate it in a dll with a non-exported type as a
> > template parameter, you will get what you want - an exported
> > specialization. Hidden visibility, OTOH, is viral, so the instantiated
> > template will silently become hidden in this case.
> >
> > Other than that, yes, it's rather similar to MSVC.
>
> It is a bad idea to dllexport templates as it greatly increases the
> chance of an ODR violation biting you in the ass (e.g. two internal
> private types with the same name). Nor is it ever necessary, as
> template implementation is always header only. Just leave templates,
> or any header implemented code, alone. Let them be compiled into a
> local implementation for every ELF object. Remove anything you really
> need to have exactly a single implementation of into a non-templated
> base class which is dllexported.
That's a very simplistic approach. In practice it is often needed to export a
template specialization for different reasons: dependency hiding, compilation
speedup, code size reduction, etc. Of course, there are complications and
caveats but "just don't do it" is often not an answer.