2011-09-20 76 views
8

我對C++如何實例化模板感到困惑。我有一段代碼:C++中的模板實例

template <class T, int arraySize> 
void test1(T (&array)[arraySize]) 
{ 
    cout << typeid(T).name() << endl; 
} 

template<class T> 
void test2(T &array) 
{ 
    cout << typeid(T).name() << endl; 
} 

int main() 
{ 
    int abc[5]; 
    test1(abc); 
    test2(abc); 
    return 0; 
} 

這裏是我的問題:
1.如何陣列ABC的大小傳遞給TEST1(參數ARRAYSIZE)?
2. C++編譯器如何確定兩個模板中T的類型?

+1

你的意思是像'test1的(ABC)'?第二個根本沒有意義。你有一個'test2 '的函數,你就像索引它是一個數組? – Shahbaz

回答

4

在test1中,編譯器創建一個T [arraySize]作爲其形式的模板。 當你調用test1(abc)時,你提供了模板匹配器自動匹配的int [5]類型的輸入參數。

但是,如果你寫

int n=10; 
int *abc = new int[n]; 
test1(abc); 
test1<int,n>(abc); 

然後編譯會失敗,編譯器會聲稱,它沒有匹配的模板test1的(ABC)函數調用或test1的< INT,N>( abc)函數調用。

這是因爲abc的大小現在是動態分配的,所以abc的類型是具有不同類型的指針,因此沒有模板可以匹配上述兩個調用。

下面的代碼顯示了某些類型的

#include <iostream> 
using namespace std; 

template <class T> void printName() {cout<<typeid(T).name()<<endl;} 

int main() 
{  
    printName<int[2]>(); //type = A2_i 
    printName<int*>();  //type = Pi 

    getchar(); 
    return 0; 
} 
+1

此外,'abc [n]'無論如何都不會編譯,因爲C++不支持動態大小的數組(就我所知,甚至不支持C++ 11)。我猜你有C99背景? –

+0

雖然它在蘋果llvm編譯器3.0下編譯得很好。已經更新了答案。感謝您指出了這一點。 – twerdster

7
  1. 沒有參數傳遞通常意義上的,因爲模板參數在編譯時解決。
  2. array參數的類型推斷出arraySizeT。由於您在編譯時分別通過int[5],arraySizeT變爲5int

如果,例如,你宣佈int* abc = new int[5];,你的編譯器會在BARF你嘗試調用test1(abc)點。除了基本的類型不匹配,int*沒有足夠的信息來推斷數組的大小。