2017-02-18 46 views
3

我以這種方式使用模板。使用typename並將typedef傳遞給函數的C++模板

#define MAX_CARS 999 
typedef char plate[20]; 

template <typename T> 
int insert_ord (T V[], int ll, int const LF, T e); 

它的工作原理,但是當我通過一個typedef作爲參數,它說:沒有匹配函數調用「insert_ord」。

這是主要的。

int main (void) 
{ 
    plate targhe[MAX_CARS];   
    int ll = 0; 

    plate targa; 
    cin >> targa; 

    ll = insert_ord(targhe, ll, MAX_CARS, targa); 

    cout << endl; 
    system("pause"); 
    return 0; 
} 
+0

參見[「數組衰變爲指針模板」(http://stackoverflow.com/questions/1863751/array-decay-to-pointers -in模板)。你應該使用引用來保存類型。嘗試'int insert_ord(T V [],int ll,int const LF,T&e)'其中'e'是參考。 –

回答

4
template <typename T> 
int insert_ord (T V[], int ll, int const LF, T e); 

上述函數模板不會爲參數類型的工作:

(int[999][20], int, int, int[20]) 

insert_ord函數的第一個參數是plate一個二維數組,而最後是類型plate這是一維數組。你應該聲明函數模板,如:

template <typename T, int sizeOuter, int sizeInner> 
int insert_ord (T (&v)[sizeInner][sizeOuter], int ll, int const LF, T (&e)[sizeOuter]); 

看到它Live On Coliru


然而,一些與您的代碼挑剔。您不需要中的void。如果可能的話,更喜歡constexpr而不是#define。最重要的是,使用std::array<T, N>或考慮包裝你的數據結構在classstruct