Сейчас я изучаю шаблон функции.
Я попробовал следующий код.
template <typename TYPE>
TYPE& Max(TYPE& a, TYPE& b)
{
return (a > b ? a : b);
}
template < >
char* Max<char*>(char* a, char* b)
{
return (strcmp(a, b) > 0) ? a : b;
}
template < >
const char* Max<const char*>(const char* a, const char* b)
{
return (strcmp(a, b) > 0) ? a : b;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a = 3.14;
float b = 2.718;
float c = Max(a, b);
char *ca = "abc";
char *cb = "def";
char *cmp = Max(ca, cb); // error (E2015)
}
На C ++ Builder XE4 я получил следующую ошибку.
E2015 Ambiguity between 'char *Ma<>(char *, char *) at Unit1.cpp:43'
and 'Max<>(char *,char *)at Unit1.cpp:43'
В этом случае, что я должен сделать, чтобы избежать ошибки 2015?
Этот код довольно нестандартный, и это указывает на то, что ваш компилятор сильно устарел.
Во-первых, эти специализации не допускаются. Основной шаблон упоминает ссылки (TYPE &
), поэтому явные специализации также должны использовать те же типы. Им разрешено изменять тело функции исходного шаблона, а не подпись.
После исправления он передает онлайн-компилятор IDEone без ошибок.
#include <string.h>
template <typename TYPE>
TYPE& Max(TYPE& a, TYPE& b)
{
return (a > b ? a : b);
}
template < >
char*& Max<char*&>(char*& a, char*& b)
{
return (strcmp(a, b) > 0) ? a : b;
}
template < >
const char*& Max<const char*>(const char*& a, const char*& b)
{
return (strcmp(a, b) > 0) ? a : b;
}
int main()
{
float a = 3.14;
float b = 2.718;
float c = Max(a, b);
char *ca = "abc";
char *cb = "def";
char *cmp = Max(ca, cb); // no error
}
Возможно, было бы неплохо попросить вашего инструктора выполнить обновление и указать на расхождения между вашим компилятором в классе и IDEone (или другим онлайн-компилятором; они всегда доступны и всегда бесплатны, как и их основное программное обеспечение) для поддержки.
Помимо проблем с компилятором и корректностью,
Неконстантный char *&
бизнес избыточен. Поскольку функция никогда ничего не изменяет, вы можете просто реализовать ее для const char
и позволить это использовать, когда указатель не const
, Возможно, оба нужны из-за специализации, но:
Специализация функций — почти всегда плохая идея. Например, вы хотите const char *
Параметры здесь, а не const char *&
, Просто удалите template <>
line и аргументы шаблона на следующей строке, и вы получите перегрузку. Эта программа представляет собой упражнение на посторонние шаблоны, которое просто усложняет ситуацию без причины.
Других решений пока нет …