Re: Allowing duplicate template specialisations
On 17.01.2011 12:50, Alexander Lamaison wrote:
On Thu, 13 Jan 2011 20:07:20 CST, Martin B. wrote:
On 13.01.2011 10:27, Alexander Lamaison wrote:
Is there a way to allow multiple definitions of the same template
specialisation?
For instance, one way of tagging COM interfaces with their associated
UUID
is using templates like this:
template<typename T> struct comtype {};
template<> struct comtype<IUnknown> { static const IID& uuid() {
return
IID_IUnknown; } }
template<typename T> inline IID& uuidof(Itf*) { return
comtype<T>::uuid();
}
Code can then get at the IID like so:
IUnknown* p = NULL; HRESULT hr = q->QueryInterface(uuidof(p),&p);
The problem is that it is very hard (impossible in the case of a
library)
to ensure that there is only one instance of each template
specialisation.
(...)
than an error about multiple definitions. Is this possible?
Enclose these definitions in an anonymous namespace:
(...)
I'm not sure I understand how that would help. I'm not having link errors
because the implementation appears in two object files. This is a
compilation problem where two definitions of the same specialisation reach
the same compilation unit.
Sorry. I misread your OP. It wasn't immediately clear to me that you
have multiple definitions in the same translation unit.
What I do not understand is how -- given that each header will include a
header guard -- it is possible to have multiple definitions of the same
thing in the same compilation unit: It's only possible if the same thing
is actually defined twice in different locations, and while this may not
necessarily be an "error" as such, it certainly feels very weird -- a
specialization is *not* a declaration and as such I would certainly
expect it to be defined only once.
If the specializations are auto-generated by a code generator it may be
a usable workaround to generate #define/ifdef macros alongside to
prevent multiple definitions of the same IID specializations in the same
translation unit.
cheers,
Martin
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]