Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка C2668 при использовании шаблонов функций, ambiguous call to overloaded function 
:(
    Опции темы
Алексей
Дата 15.4.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Здравствуйте. Это просто код из учебника.
Код

#include <iostream>

   using namespace std;
    template<class T> T max(T a, T b)

    {
       if (a > b) return(a);
       else return(b);
    }

    float max(float, float);

    int max(int, int);

    int main()

    {
       cout <<max(100, 200) << endl;
       cout <<max(5.4321, 1.2345) << endl;
    return 0;
    }


В Borland C++ 3.1 работает отлично, а вот в Visual C++ 2005 пишет "error C2668: 'max' : ambiguous call to overloaded function. Почему так?

Заранее спасибо.

PM MAIL   Вверх
Daevaorn
Дата 15.4.2007, 20:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Алексей @  15.4.2007,  21:24 Найти цитируемый пост)
Почему так?

Компилятор не может выбрать функцию. Добавлением после дробный констант буквы f, решается проблема компиляции, но появляется другая - линковки, т.к. перегруженные функции для float и int не реализованы.
PM MAIL WWW   Вверх
Xenon
Дата 15.4.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Можно так по-моему сделать:
Код

template<class T, class T2>
T max(T a, T b)
{
   if (a > b) return(a);
   else return(b);
}



--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 15.4.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А смысл вводить T2, когда он не используется?
Может проще убрать объявления float max(float, float) и  int max(int, int)?
PM   Вверх
Nil
Дата 15.4.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Код

#include <iostream>

   using namespace std;
    template<class T> T max1(T a, T b)
    {
       if (a > b) return(a);
       else return(b);
    }
    float max1(float, float);
    long max1(long, long);
    int main()
    {

      cout<<max1(345,346);
       cout <<max1(5.4, 1.2) << endl;
       
    return 0;
    }

Почему не знаю честно говоря...
Но max полюбому зарезервировано...
А вот почему с int не пашет не пойму.....
P.S. И вообще-то действительно не вижу смысла в
Код

 float max1(float, float);
    long max1(long, long);


Это сообщение отредактировал(а) Nil - 15.4.2007, 21:15
PM MAIL WWW ICQ   Вверх
Xenon
Дата 15.4.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



bsa, если просто убрать, то не соберется. Тоже будет ambiguous call to overloaded function

Добавлено @ 21:44
А, доперло почему. max в std есть smile
Вот теперь и говори, что using namespace std - не зло smile

Это сообщение отредактировал(а) Xenon - 15.4.2007, 21:45


--------------------
user posted image  
PM MAIL   Вверх
Алексей
Дата 15.4.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



Спасибо. И все же почему с int не работает? 
PM MAIL   Вверх
Rockie
Дата 17.4.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Алексей, первая функция - шаблонная, компилятор сгенерирует функции для любого встроенного типа. Поэтому нет смысла перегружать функцию еще раз. А max в VS 2005 даже визуально выделяется другим цветом, то есть такая функция уже есть в стандартной библиотеке. 
Код

#include <iostream>

using namespace std;

template<class T> T Mymax(T a, T b)
{
    if (a > b) return(a);
    else return(b);
}

int main()
{
    cout <<Mymax(100, 200) << endl;
    cout <<Mymax(5.4321, 1.2345) << endl;
    return 0;
}


Добавлено через 1 минуту и 59 секунд
А в данном случае вызывается функция max из std:
Код

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    cout <<max(100, 200) << endl;
    cout <<max(5.4321, 1.324)<< endl;
    cout <<max('a','b')<< endl;
    return 0;
}





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Daevaorn
Дата 17.4.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Rockie @  17.4.2007,  18:24 Найти цитируемый пост)
А max в VS 2005 даже визуально выделяется другим цветом, то есть такая функция уже есть в стандартной библиотеке. 

В данном случае это не особо имеет значение, т.к. у стандартной функции другая сигнатура. И в списке вариантов компилятора она последняя.
Цитата(Rockie @  17.4.2007,  18:24 Найти цитируемый пост)
Поэтому нет смысла перегружать функцию еще раз

Ну как некий вариант специализации, перегрузка иногда полезна
PM MAIL WWW   Вверх
Xenon
Дата 17.4.2007, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Поэтому нужно делать вот так smile
Код

#include <iostream>

template<class T> T max(T a, T b)
{
    if (a > b) return(a);
    else return(b);
}

int main()
{
    std::cout << max(100, 200) << std::endl;
    std::cout << max(5.4321, 1.2345) << std::endl;
    return 0;
}


Добавлено через 8 минут и 49 секунд
Daevaorn, но если нужно специализировать, то почему бы это не делать должны образом?
Код

template<> int max<int> (int a, int b)
{
    std::cout << "Yo";
    return 0;
}



--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 17.4.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Посмотрел. Это вообще - макрос
Код

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif  /* max */





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 17.4.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Rockie, где эту ты такое посмотрел? Это функция же, iostream по крайней мере.


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 17.4.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Xenon @  17.4.2007,  18:39 Найти цитируемый пост)
 но если нужно специализировать, то почему бы это не делать должны образом?

у всех свои привычки и стиль
PM MAIL WWW   Вверх
Nil
Дата 17.4.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 15.4.2007

Репутация: нет
Всего: нет



Rockie, да я тож сначала увидел что это макрос...Но после того как #undef не помог разглядел функцию )
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.