2013-12-13 223 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