2012-02-01 51 views
0

我只是想知道爲什麼我應該讓我傳遞給函數模板的變量必須是const?爲什麼const關鍵字對於定義模板參數是強制性的?

例如: -

#include <iostream> 
    using std::cout; 
    using std::endl; 

    template< typename T> 
    void printArray(T *array, int count) 
    { 
     for (int i = 0; i < count; i++) 
     cout << array[ i ] << " "; 
     cout << endl; 
    } 

    int main() 
    { 
    const int ACOUNT = 5; // size of array a 
    const int BCOUNT = 7; // size of array b 
    const int CCOUNT = 6; // size of array c 

    int a[ ACOUNT ] = { 1, 2, 3, 4, 5 }; 
    double b[ BCOUNT ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 }; 
    char c[ CCOUNT ] = "HELLO"; // 6th position for null 

    cout << "Array a contains:" << endl; 

    // call integer function-template specialization 
    printArray(a, ACOUNT); 

    cout << "Array b contains:" << endl; 

    // call double function-template specialization 
    printArray(b, BCOUNT); 

    cout << "Array c contains:" << endl; 

    // call character function-template specialization 
    printArray(c, CCOUNT); 
    return 0; 
    } 

在這裏,主要功能: - 我聲明變量

const int ACOUNT = 5; // size of array a 
const int BCOUNT = 7; // size of array b 
const int CCOUNT = 6; // size of array c 

const。如果我不把它們聲明爲const,那麼我會得到一個錯誤「未初始化的數組」。

任何人都可以請讓我知道,如果這是發送到函數模板的參數必須是常量類型的規則?

回答

4

我只是想知道爲什麼我應該讓我傳遞給函數模板的變量必須是const?
不,你不需要,問題在於別處。

在C++中,您不允許有Variable Length Arrays(VLA)
因此,當你聲明一個數組時,這個長度應該被聲明爲一個編譯時間常量。

const int ACOUNT = 5; // size of array a 
const int BCOUNT = 7; // size of array b 
const int CCOUNT = 6; // size of array c 

int a[ ACOUNT ] = { 1, 2, 3, 4, 5 }; 
double b[ BCOUNT ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 }; 
char c[ CCOUNT ] = "HELLO"; // 6th position for null 

在上面的例子中,如果沒有const,你的陣列將得到聲明爲VLA和未在C++允許。

相關問題