2011-09-22 76 views
1

我不明白爲什麼模板參數只能用const變量初始化。 作爲,爲什麼不將下面的代碼工作:C++,模板的非參數類型:只有const變量?

#include <iostream> 
template <class T,int dim> 
class Vec 
{ 
    T _vec[dim]; 
    int _dim; 
    public: 
    Vec() : _dim(dim) {}; 
    ~Vec() {}; 
    // other operators and stuff 
}; 
int main() { 
    int dim = 3; 
    Vec < int, dim> vecInt3; 
} 

如果我添加一個const在主,一切的朦朧的定義是罰款。這是爲什麼?

回答

3

整數類型參數必須是編譯時常量。您必須使用整數字面量或使您的變量const。原因是模板在運行之前被實例化,並且如果您稍後可能更改變量名稱,則程序將表現出與模板不一致的情況。

0

我想,這是因爲你不能在T _vec[dim]中創建一個帶有變量的表作爲長度。爲什麼不考慮內置的矢量類型呢?

+0

這樣可以避免這個問題(在模板中不需要'dim'),但不能解釋原因。 – MSalters

0

首先,模板在編譯時建,這就是爲什麼你必須使用一個常量的值:它不能在運行時進行計算。事實上,當你編譯你的代碼時,這個類將被編譯一次,以用於每個不同的參數使用。

之後,代碼應該工作,如果沒有其他語法錯誤。

發瘋之前的一個重要注意事項:無法在頭文件/ cpp文件中拆分模板,必須在同一文件中編寫頭文件和實現文件!

0

因爲模板參數應該在編譯時計算。編譯器將爲不同的參數編碼。

就你而言,你可以看到如果dim不是一個const,編譯器就不知道應該爲vecInt3分配多少空間。實際上Vec<int, 1>Vec<int, 2>是不同的類型。

如果你想要一個具有動態大小的矢量,你可以看到std::vector得到一些想法。