Re: singleton question
On Jul 16, 6:40 am, ben chang <devn...@NOSPAM.bcchang.com> wrote:
i'm hacking at some code originally written for VC++, trying to port to
linux GCC 4. the linker returns multiple-definition errors with a
singleton object, which i guess is not a problem in visual c++. i'll try
to excerpt the relevant parts without posting all the source files (it's
the maya exporter for the Ogre 3D engine).
there's a pretty standard-looking Singleton template, and in a file called
"materialSet.h" we have a class using it:
/////
namespace OgreMayaExporter
{
class MaterialSet : public Singleton<MaterialSet>
{
(nothing unusual in here, so i won't bore you... )
};
template<> MaterialSet Singleton<MaterialSet>::ms_Singleton=0;
What is this line supposed to be doing? If the template
Singleton is written correctly, it shouldn't be necessary. As
it is, you're defining an explicit specialization of a template
data member (presumably static). Explicit specializations
aren't templates, however, they're instantations of templates,
and thus normal classes, functions or data. You wouldn't expect
defining normal data like this in a header file to work, and
that's really what you're doing. (The result is a multiple
definition, a violation of the one definition rule, and thus
undefined behavior. Most compilers will complain in the link
phase, but no diagnostic is actually required.)
I'm not sure why you're declaring the instance anyway.
Normally, depending on the variant of singleton you're using,
the instance is either a local variable of the
Singleton::instance function, or allocated dynamically. In the
latter case, the Singleton template might declare a pointer as a
static, in which case, the header which defines the template
would require something like:
template< typename T >
T* Singleton< T >::ourInstance = 0 ;
Note that unlike your definition, this is also a template (and
not an explicit instantiation), and so should behave like all
templates, with multiple definitions being allowed (as long as
they are the same), and the compiler ensuring that everything
works as if there were a single definition for each
instantiation.
}
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34