2015-11-22 3 views
0

Я пишу программу, которая требует функции шаблона, имеющей массив элементов, и количество элементов в этом массиве в качестве аргументов. Функция должна вернуть самый большой элемент в указанном массиве. Программа также должна иметь специализацию (с чем у меня возникают проблемы), которая проверяет самую длинную строку в массиве, если введен массив строк.Явная специализация: синтаксическая ошибка?

Вот мои прототипы:

template <typename T> 
T compare(T const arr1[], int n); 

template <> const char *compare<const char *>(const char *const arr2[][3], int n); 

основной программы ..

int main() 
{ 
    int a[7] = { 3, 67, 100, 91, 56, 67, 83 }; 
    double b[] = { 2.5, 2.6102, 2.61, 1.03 }; 
    //char* c[3] = { "see if this works", "functions", "explicit specialization" }; 
    char c0[30] = { "see if this works" }; 
    char c1[30] = { "functions" }; 
    char c2[30] = { "explicit specialization" }; 
    char *d[][3] = { c0, c1, c2 }; 

    cout << "Comparing int values: " << endl; 
    cout << "Largest int value is: " << compare(a, 7) << endl; 
    cout << "Comparing double values: " << endl; 
    cout << "Largest double value is: " << compare(b, 4) << endl; 

    return 0; 
} 

определение функции ...

template <typename T> 
T compare(T const arr1[], int n) { 
    T temp; 
........ 
    return temp; 
} 

template <> const char *compare<const char *>(const char *const arr2[][3], int n); { 
    const char *temp2 = &arr2[0]; 
    return *temp2; 
} 

Я написал фиктивный код, чтобы проверить, является ли второй функции работает, но он не возвращает правильное значение (он возвращает «явную специализацию»). Может кто-то указать вне меня, что случилось с синтаксисом?

+3

Когда вы думаете, что вы хотите, чтобы полностью специализировать шаблон функции, что вы действительно хотите, чтобы перегружать его с непостоянным функция шаблона. Полностью специализация - это то, что вы делаете для классов шаблонов, а не для шаблонов. – JSF

+0

Спасибо. В настоящее время я просматриваю упражнения книги, и инструкции должны включать специализацию для проверки самой длинной строки. – mi5tch

ответ

1

Как было сказано выше, перегрузка гораздо больше подходит к этой проблеме, чем специализации:

const char *compare(const char *const arr2[], int n); 

Обратите внимание, что в то время как я положил квадратные скобки в тип параметра в соответствии шаблон, это заявление равносильно один с const char *const *arr2, потому что функциональные параметры являются особыми в этом отношении.


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

Рассмотрим, что T является и то, что ваша специализация для. T - это тип элемента последовательности, и вы создали свой шаблон для T=char. Это означает, что вы специализировали свой шаблон для последовательности символов, а не для последовательности строк.

специализироваться для последовательности строк C, подставим const char * для T, а не char:

template <> const char *compare<const char *>(const char *const arr2[], int n); 
+0

Спасибо! Я вижу вашу точку зрения о последовательности строк. В настоящее время я выполняю упражнения моей книги, и инструкции должны были использовать указатель-к-char и количество указателей, но не совсем уверены, как использовать это в специализированной функции (как требование упражнения тоже)? – mi5tch