Initializing static const variables of template classes

D

david.baird

I have 3 classes, 1 which does not use templates, CGood, and 2 which
do use templates, CBad, and COkay. I believe that all of them should
work, but only CGood and COkay are working for me. CBad fails to
compile.

class CGood
{
public:
typedef int arr_t[2];
static const arr_t bar;
};

const CGood::arr_t CGood::bar = { 1, 2 };

template <class T>
class CBad
{
public:
typedef T arr_t[2];
static const arr_t bar;
};

template <class T>
// g++ says ``error: expected initializer before 'CBad''':
const CBad<T>::arr_t CBad<T>::bar = { 1, 2 };

template <class T>
class COkay
{
public:
typedef T arr_t[2];
static const arr_t bar;
};

template <class T>
const T COkay<T>::bar[2] = { 1, 2 };

Can anyone tell me if there is something is wrong (or right) with
CBad? It seems fine to me, but the compiler just doesn't like it.

If it is helpful, here is my g++ version:

$ g++ --version
g++ (GCC) 4.1.1 (Gentoo 4.1.1-r3)
 
D

david.baird

Well, I just figured it out :) Maybe someone will find this
useful...

template <class T>
// g++ says ``error: expected initializer before 'CBad''':
const CBad<T>::arr_t CBad<T>::bar = { 1, 2 };

Instead, use the typename keyword:

template <class T>
const typename CBad<T>::arr_t CBad<T>::bar = { 1, 2 };


This website says some nice things about typename (though I am still
trying to wrap my head around it):

http://www.gotw.ca/gotw/035.htm
GotW #35
 

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,755
Messages
2,569,536
Members
45,008
Latest member
HaroldDark

Latest Threads

Top