On Mon, 2005-06-06 at 10:43 +0200, Tim Goetze wrote: > <snip/> > What I have is this (from caps code): > > class DescriptorStub > : public LADSPA_Descriptor > { > /* just a constructor and destructor here */ > }; > > template <class T> > class Descriptor > : public DescriptorStub > { > public: > Descriptor() > { setup(); } > > void setup(); > > ... > }; > > The following is OK for an older g++: > > void > Descriptor<AmpIV>::setup() > { > UniqueID = 1794; > ... > } > > but g++ since 4.0 wants this instead: > > template <> void > Descriptor<AmpIV>::setup() > { > ... > } > > I cannot for the life of me imagine a good reason why "template <>" > should be necessary. "setup()" was never declared as a template, let > alone one with an empty template parameter. > > If this is indeed prescribed by the language standard, I'll have a > very, very hard time getting over it.
> It may not look like much but you have to understand that to me coding > is also an exercise in aesthetics. > Then perhaps you shouldn't be cracking this little nut with the sledgehammer of template specialisation, regardless of whether g++ used to supply a non-standard one with a shorter handle? ;) How about adding the unique IDs as static member constants to AmpIV and its brethren like this: class AmpIV { ... public: static const unsigned UniqueID = 1794; ... }; ...which your Descriptor template can pick up without using any specialisation like this: template <class T> class Descriptor : public DescriptorStub { public: Descriptor() { UniqueID = T::UniqueID; } ... }; Just a thought. Cheers Simon