2013-12-13 192 views
0

我想写一类的功能,并有以下几点:设置一类的静态

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; 
}; 

我会喜欢初始化X(0,1,0),但不知道怎么做。我想声明X =(0,1,0)就像在程序开始时声明#define pi = 3.142一样。我应该如何去做这件事?

+0

你有C++ 11吗? – chris

+0

@chris是的,我喜欢。 – BlackAdder

回答

2

你做了什么是好的,但你可能会得到一个链接错误因为你不为X提供任何存储。你需要这样做:

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); 

与非模板静态变量,这是好的一个头去 - 与其他模板的Bar<Foo>::X重复定义将在链接时合并。

+0

非常感谢Tristan! – BlackAdder

1

删除静态声明出来的类:

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... 
+0

但是'Foo'没有在课堂外宣布,那么我该如何补救? – BlackAdder

+0

美孚只是一个模板类型的东西,你必须指定的地方。 Foo在课堂上也没有真正的声明。 – user1810087

+0

@BlackAdder参见[this](http://ideone.com/o8qD2o)示例 – user1810087