Static variable in class template - multiple definition

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
 
N

Noah Roberts

Hel said:
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.

Because A<0>::a has multiple definitions actually. Try just moving that
one.

BTW, you might consider an alternative design, since you are dealing
with integral values:

template < unsigned N >
struct A
{
enum { a = A<N-1>::a * N };
};

template <>
struct A<0>
{
enum { a = 1 };
};

Numerous benefits here. For instance, I don't believe any of the A
objects are actually instantiated and therefore, unlike your static int
version that will instantiate all in between, there is only one static
value that is generated by the metaprogram.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top