2013-09-24 3 views
0

Теперь я изучаю шаблон функции.отличия шаблонов функций

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

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 года?

+3

Сначала вырезаем и вставляем сообщение об ошибке, чтобы мы могли видеть, что он на самом деле сказал (прямо сейчас это явно неправильно, например, вызов одной из двух «Ма» вместо «Макс»). –

+0

Благодарим вас за рекомендацию. Я вставил сообщение об ошибке через свой текстовый редактор, в котором я могу удалить часть текста. – sevenOfNine

ответ

1

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

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

+0

Большое спасибо за ваш ответ, Potatoswatter. Поэтому я должен использовать те же типы, что и «TYPE &». Затем образец кода, который вы мне дали, работал без ошибок в моей среде IDE. Благодарим вас за дальнейшие рекомендации по использованию шаблонов. Я буду помнить об этом в своей будущей работе. – sevenOfNine

+0

Я нашел сайт ideone очень полезным. Спасибо также за то, что сообщили мне об этом сайте. – sevenOfNine

Смежные вопросы