2012-02-13 100 views
3

我有以下模板:模板和const在C++

#include <iostream> 
template <class T,T defaultVal, int dim=255> 
class Vec 
{ 
    T _vec[dim]; 
    int _dim; 
public: 
    Vec() : _dim(dim) 
    { 
     for (int i=0;i<_dim;++i) 
     { 
      _vec[i] = defaultVal; 
     } 
    } 
    ~Vec() {}; 
    // other operators and stuff 
}; 
int main() 
{ 
    int defValue = 0; 
    Vec < int,defValue > vecWithDefVal; 
} 

但該程序將無法編譯,因爲模板值必須在編譯時是已知的,意思是常量或const字面。

我真的不知道這個錯誤,任何人都可以解釋給我看?

+0

在您最喜歡的C++書籍中查找「常量表達式」。 – sellibitze 2012-02-13 11:52:02

回答

4

模板類在創建編譯時,因此該值在編譯時是已知的。如果它不是const,那麼直到運行時纔會知道它,所以編譯器無法創建模板類。

+0

它可以只是一個數字嗎?比如說4? (對不起,不編譯我自己,現在不在我的電腦上) – Itzik984 2012-02-13 11:45:26

+0

是的,這是一個常量表達式(檢查鏈接頁面,「文字」) – 2012-02-13 11:47:07

+0

是的另外:template 也可以工作,如果T和int是兼容的(或者有一個T的構造函數取int) – 2012-02-13 11:50:43

1

正如編譯器告訴你的,它必須是一個常量表達式。

使用const int defValue = 0;

+0

但是解釋是什麼?沒有const的 – Itzik984 2012-02-13 11:35:24

+0

,'defValue'不是一個常量表達式。現在:http://msdn.microsoft.com/en-us/library/3ffb821x.aspx直到有人挖你相關的C++標準段落。 – 2012-02-13 11:36:47

+0

@ itzik984:模板是編譯時間,與運行時的C#泛型不同。所以你需要在編譯時進行一切可評估的工作。 – Aamir 2012-02-13 11:39:02

0
const int defValue = 0; 
Vec<int, defValue> vecWithDefVal; 
1

通常,對每個要使用的值使用不同的類型並沒有多大用處。在大多數情況下,我希望您希望使用T()作爲默認默認值(不,重複的「default」不是類型),並且可以使用構造函數參數覆蓋對象的默認值。當您想要在運行時確定該值時,使用默認的模板參數不起作用。

實際上,問題中的代碼顯示了爲什麼使用默認值作爲模板參數存在問題:您只能使用常量表達式作爲參數。也就是說,只有編譯器在編譯時才能找到的參數是可行的。此外,這些都需要明確標明是恆定的,以及:

int const defValue = 0; 

對付你可以考慮使用一個指針或在命名空間範圍的對象的引用非整數類型。但是,我認爲使用構造函數參數是這裏真正需要的。