различие шаблонов функций

Сейчас я изучаю шаблон функции.

Я попробовал следующий код.

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?

0

Решение

Этот код довольно нестандартный, и это указывает на то, что ваш компилятор сильно устарел.

Во-первых, эти специализации не допускаются. Основной шаблон упоминает ссылки (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
}

http://ideone.com/gR9VFX

Возможно, было бы неплохо попросить вашего инструктора выполнить обновление и указать на расхождения между вашим компилятором в классе и IDEone (или другим онлайн-компилятором; они всегда доступны и всегда бесплатны, как и их основное программное обеспечение) для поддержки.

Помимо проблем с компилятором и корректностью,

  1. Неконстантный char *& бизнес избыточен. Поскольку функция никогда ничего не изменяет, вы можете просто реализовать ее для const char и позволить это использовать, когда указатель не const, Возможно, оба нужны из-за специализации, но:

  2. Специализация функций — почти всегда плохая идея. Например, вы хотите const char * Параметры здесь, а не const char *&, Просто удалите template <> line и аргументы шаблона на следующей строке, и вы получите перегрузку. Эта программа представляет собой упражнение на посторонние шаблоны, которое просто усложняет ситуацию без причины.

1

Другие решения

Других решений пока нет …