2017-02-18 20 views
3

Я использую шаблон таким образом.C++ Шаблон с использованием typename и передачи typedef для функции

#define MAX_CARS 999 
typedef char plate[20]; 

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

Это не работает, но когда я прохожу ЬурейиЙ в качестве аргументов он говорит: нет подходящей функции для вызова «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 кол-шаблоны). Вы должны использовать ссылку для сохранения типа. Попробуйте '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 функции является 2D массив plate, в то время как последний является типа plate, который является массивом 1D. Вы должны объявить функцию-шаблон как:

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


Однако несколько nitpicks с вашим кодом. вам не нужно, чтобы void в int main(). И предпочитайте constexpr по #define, если это возможно. Самое главное, использовать std::array<T, N> или рассмотреть обертывание структуру данных в class или struct