H
Hel
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.)
TIA
Helge
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.)
TIA
Helge