2015-11-28 5 views
-2
#include <iostream> 

#define M 6 
#define N 5 

template <class T> 
T *merge(T *a, T *b) { 
    T *c = new int[N+M]; 
    for (int i=0, j=0, k=0; k<N+M; k++) 
    if (j>=M || (i<N && a[i] < b[j])) c[k] = a[i++]; 
    else        c[k] = b[j++]; 
    return c; 
} 

int main() { 
    int a[N] = {3, 2, 5, 11, 7}; 
    char b[M] = {'i', 's', 'b', 'y', 'o', 'p'}; 
    int *c = merge(a, b); 
    for (int i=0; i<N+M; i++) 
    std::cout << c[i] << std::endl; 
} 

Когда я компилирую код, он дает мне «sort.cpp: 18: ошибка: нет подходящей функции для вызова«слияния (интермедиат [5], символ [6]) «». Может кто-нибудь объяснить, что я сделал неправильно? Спасибо.Пытаясь научиться использовать шаблону

+1

Использовать константы не макросы. –

ответ

1

При вызове merge(a,b), компилятор пытается вывести тип T учитывая аргументы a и b. a распадается до int* и b распадается до char*. b необходимо преобразовать в int* для ввода типа типа в результате T = int или a необходимо преобразовать в char* для вывода результата в T = char. Поскольку ни то, ни другое не являются допустимыми преобразованиями, компилятор не может вывести T.

Вы можете решить эту проблему, сделав b массив int с или путем a массива char с.

2

Can someone explain what I did wrong?

Ну, я не буду говорить, что вы не должны сливаться список целых чисел и список символов, потому что вы могли бы сделать, если вы действительно хотите (для целей обучения может быть?)

Итак, ответ @R Sahu верен в том смысле, что вы смешиваете типы, которые не являются неявно конвертируемыми. Тем не менее, это не тот ответ, который вам нужен. Вместо этого почему это неправильное использование этого шаблона, вы хотите знать почему это шаблон для неправильного использования.

То, что вы сделали не так (предположим, что вы хотите смешать типы) должен был объявить, что вы шаблон с только один typename, следовательно, заставляя оба аргумента, чтобы быть того же типа:

template <class T> T *merge(T *a, T *b)

Вы видите, a и b - оба указателя типа T, что невозможно, потому что char* и int* несовместимы. Вам потребуется два typenames для размещения вы используете:

template <class T, class U> T *merge(T *a, U *b)

И это именно то, что сообщение об ошибке компиляции говорит вам: у вас есть два типа, но не шаблон не может соответствовать.