Программа не может вызвать реализацию специализированного шаблона - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь изучить шаблон C ++. Пока я запускаю следующий пример, программа не может вызвать реализацию специализированного шаблона. Поэтому я получил неправильный вывод. Кто-нибудь может сказать, почему?

template <class T>
T max(T a, T b)
{
    cout << "2 ..." <<endl;
    return a > b ? a : b;
}
template<>
char* max(char* a, char* b)
{
    cout << "1 ..." <<endl;
    return strcmp(a, b) > 0 ? a : b;
}
int main()
{
    cout << max("Aladdin", "Jasmine") << endl;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Причина, по которой вы видите проблему, состоит в том, что передаваемые аргументы имеют тип char const * (также может быть написано const char *). В C ++ не существует какого-либо стандартного способа распечатать полное имя типа. Но есть способ проверить подобные вещи ..

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

#include <iostream>
#include <cstring>

using ::std::cout;
using ::std::strcmp;

char* max(char* a, char* b)
{
    cout << "1 ..." << '\n'; // Don't use ::std::endl Use cerr if you need flushing.
    return strcmp(a, b) > 0 ? a : b;
}
int main()
{
    cout << max("Aladdin", "Jasmine") << '\n';
    return 0;
}

Компилятор мог бы предупредить вас, что вы пытаетесь вызвать функцию, которая принимает неконстантные аргументы с константными аргументами, и вы бы точно поняли, в чем проблема.

0 голосов
/ 11 ноября 2018

Аргументы передаются как постоянный символ.Поэтому попробуйте следующий код.Обратите внимание, что я также включил необходимый заголовочный файл включает.Кроме того, настоятельно рекомендуется использовать std::cout или using std::cout;.

#include <iostream> 
#include <cstring> 

template <class T> 
T max(T a, T b) 
{ 
    std::cout << "2 ..." << std::endl; 
    return a > b ? a : b; 
} 

template<> 
const char* max(const char* a, const char* b) 
{ 
    std::cout << "1 ..." << std::endl; 
    return std::strcmp(a, b) > 0 ? a : b; 
} 

int main() 
{ 
    std::cout << max("Aladdin", "Jasmine") << std::endl; 
    return 0; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...