Reputation: 127
I'm trying to write a class as an exercise and have the following:
template <class Foo>
class Bar
{
protected:
Foo _x,_y,_z;
public:
Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
Bar() {_x=0; _y=0; _z=0;};
static const Bar<Foo> X;
};
I'll like to initialise X
as (0,1,0)
but have no idea how to do so. I would like declare X =(0,1,0)
to be like declaring #define pi = 3.142
at the start of a program. How should I go about doing this?
Upvotes: 0
Views: 84
Reputation: 5334
Remove the static declaration from the class:
template <class Foo>
class Bar
{
protected:
Foo _x,_y,_z;
public:
Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
Bar() {_x=0; _y=0; _z=0;};
};
const Bar<Foo> X(0,1,0); // Foo should be a type...
Upvotes: 1
Reputation: 16864
What you've done is fine, but you're probably getting a linker error as you're not providing any storage for X
. You need to do this:
template <class Foo>
class Bar
{
protected:
Foo _x,_y,_z;
public:
Bar(Foo x, Foo y, Foo z) {_x=x; _y=y; _z=z;};
Bar() {_x=0; _y=0; _z=0;};
static const Bar<Foo> X;
};
template <typename Foo>
const Bar<Foo> Bar<Foo>::X(0, 1, 0);
Unlike non-template static variables, this is fine to go in a header -- as with other templates, duplicate definitions of Bar<Foo>::X
will be merged at link-time.
Upvotes: 2