Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка C2668 при использовании шаблонов функций


Автор: Алексей 15.4.2007, 20:24
Здравствуйте. Это просто код из учебника.
Код

#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. Почему так?

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

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

Компилятор не может выбрать функцию. Добавлением после дробный констант буквы f, решается проблема компиляции, но появляется другая - линковки, т.к. перегруженные функции для float и int не реализованы.

Автор: Xenon 15.4.2007, 20:53
Можно так по-моему сделать:
Код

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

Автор: bsa 15.4.2007, 21:03
А смысл вводить T2, когда он не используется?
Может проще убрать объявления float max(float, float) и  int max(int, int)?

Автор: Nil 15.4.2007, 21:13
Код

#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);

Автор: Xenon 15.4.2007, 21:42
bsa, если просто убрать, то не соберется. Тоже будет ambiguous call to overloaded function

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

Автор: Алексей 15.4.2007, 22:09
Спасибо. И все же почему с int не работает? 

Автор: Rockie 17.4.2007, 17:24
Алексей, первая функция - шаблонная, компилятор сгенерирует функции для любого встроенного типа. Поэтому нет смысла перегружать функцию еще раз. А 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;
}



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

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

Ну как некий вариант специализации, перегрузка иногда полезна

Автор: Xenon 17.4.2007, 17:39
Поэтому нужно делать вот так 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;
}

Автор: Rockie 17.4.2007, 17:59
Посмотрел. Это вообще - макрос
Код

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



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

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

у всех свои привычки и стиль

Автор: Nil 17.4.2007, 18:23
Rockie, да я тож сначала увидел что это макрос...Но после того как #undef не помог разглядел функцию )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)