2013-04-12 62 views
1

我認爲這很容易,但我還沒有得到這個工作。我想使用模板來定義類的靜態無符號字符數組成員數據成員的大小。我在我的兩個函數上使用模板來定義正在使用的數據類型,並且工作正常。我在想這樣的事情:使用模板來定義類中的靜態數組

template<unsigned S> 
class Buff 
{ 
private: 
    static unsigned char buffer[S]; 
    int offset; 
public: 
    pAllocBuff(){offset=0;}; 
    template <typename T> 
    T* New(T, int); 
    template <typename T> 
    T* New(T); 

}; 

這個想法是New(T,int)從緩衝區中爲數據類型數組分配內存。

即:char* i = myBuff.New<char>('\0',15); //allocate 15 byte array to i from buffer and initialized to '\0'

或新(T)從所述緩衝器用於單個數據類型

即分配內存:string* j = myBuff.New<string>("Hello Stack Overflow!"); //allocate memory to string object j from buffer and initialize

如果我更換 'S' 與BUFFSIZE和#定義BUFFSIZE 1024 * 1024(或其他),一切都很好。但我想這樣做,以便緩衝區的大小可以爲不同的Buff實例定義。因此,像:

Buff<1024*1024> myBuff;

當我做到這一點,在我的課的所有成員函數被標記爲缺少模板參數,即使S有沒有關係他們。

編輯:我得到這個工作與下面的建議。我猜IM困惑,爲什麼

「模板」

必須在類中的每個功能上面,即使S沒有在該函數中使用。這只是因爲它在課堂上才需要嗎? 感謝您的知識!

+0

你需要顯示實際的錯誤,以及使用它的實際代碼。在有問題的版本中 – sehe

+0

編譯器?版? – dyp

+0

是'pAllocBuff()'錯字?它應該是'Buff()' – 2013-04-12 22:25:05

回答

1

不管怎麼說,這工作了罰款對我來說:http://liveworkspace.org/code/3L72Lq$0

template<unsigned S> 
class Buff 
{ 
private: 
    static unsigned char buffer[S]; 
    int offset; 
public: 
    Buff() : offset() {} 
    template <typename T> T* New(T, int); 
    template <typename T> T* New(T); 
}; 

template<unsigned S> 
/*static*/ 
    unsigned char Buff<S>::buffer[S] = {0}; 

template<unsigned S> 
    template <typename T> T* Buff<S>::New(T, int) 
{ 
    return nullptr; // TODO 
} 

template<unsigned S> 
    template <typename T> T* Buff<S>::New(T) 
{ 
    return nullptr; // TODO 
} 

int main() 
{ 
    Buff<(1u<<12)> one; 
    Buff<(1u<<14)> two; 
} 

我敢肯定,這是一個小的語法事故與類模板中的成員函數模板,定義外的類(你沒有顯示)。

+0

This Works!我嘗試過類似的東西,但之前沒有用。我一定是把東西放在了錯誤的地方或什麼東西上。你能解釋爲什麼模板需要通過每個成員函數,即使沒有使用S?另外,通過聲明緩衝區爲靜態,這是否意味着其他類的實例與h共享相同的緩衝區?再次感謝。 – radensb

+0

@radensb你爲什麼不比較這兩個,以便你看到問題是什麼,並從經驗中學習?乾杯 – sehe

+0

我已經改變了很多次,我沒有什麼可比較的。我只記得之前嘗試過類似的東西,但我敢打賭,我從來沒有將模板代碼放在每個成員函數的上面,這可能是VS爲什麼將它標記爲錯誤。 – radensb