Re: Static variable in class template - multiple definition
Hel wrote:
Hi,
I'm sure you are familiar with this problem:
A.h:
template <unsigned N> struct A {
static const unsigned a;
};
template <> const unsigned A<0>::a = 1;
template <unsigned N> const unsigned A<N>::a = A<N-1>::a*N;
Now if I include A.h from multiple .cpp files I get a linking error
because A<N> has multiple definitions. Easy solution there, move the
definitions to A.cpp and just include A.h. BUT:
B.h:
#include "A.h"
template <unsigned M> class B {
int b[A<M>::a];
};
This only works if the compiler has seen the definition of A<N>::a. (g+
+ 4.2 says "array bound is not an integer constant".)
I can't wrap my head around this one. I need the declaration for B<M>
in many .cpp files, and I need to calculate A<M>::a in the declaration
of B (in fact, not to define the size of the array, but as another
template parameter - so dynamic allocation is not an option. The
template definition is left out for brevity's sake.)
Since it's a static integral constant, you can simply initialise it in
the class itself:
template <unsigned N> struct A {
static const unsigned a = A<N-1>::a * N;
};
And specialise the whole class instead of defining the member in the
header...
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask