Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2014, 15:30   #1
zla9_kolu4ka
Форумчанин
 
Регистрация: 16.09.2013
Сообщений: 149
По умолчанию шаблоны и cout

Что то не пойму, почему так ошибки выдает
error C2668: max: неоднозначный вызов перегруженной функции

Код:
#include <iostream>
#include <conio.h>
using namespace std;

template<class T> 
T max(T a, T b){
	if (a > b) return(a);
	else return(b);
}
void main(void){
	char ch;
	cout << "max 100 VS 200 = " << max(100, 200) << endl;
	cout << "max 5.4321 VS 1.2345 = " << max(5.4321,1.2345); 
	ch = getchar();
}
а так норм
Код:
#include <iostream>
#include <conio.h>

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


void main(void){
	using std::cout;
	using std::endl;
	char ch;
	cout << "max 100 VS 200 = " << max(100, 200) << endl;
	cout << "max 5.4321 VS 1.2345 = " << max(5.4321,1.2345); 
	ch = getchar();
}

Последний раз редактировалось zla9_kolu4ka; 03.03.2014 в 15:37.
zla9_kolu4ka вне форума Ответить с цитированием
Старый 03.03.2014, 15:56   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

потому что есть уже такая функция в пространстве std

http://www.cplusplus.com/reference/algorithm/max/
_Bers вне форума Ответить с цитированием
Старый 03.03.2014, 21:23   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Можно придумать имя для своего собственного пространства имён:

Код:
#include <iostream>

namespace my {

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

}

int main(int argc, char *argv[]) {

    std::cout << "Hello, World!" << std::endl;
    std::cout << "max 100 VS 200 = " << my::max(100, 200) << std::endl;
    std::cout << "max 5.4321 VS 1.2345 = " << my::max(5.4321, 1.2345);

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 08.03.2014, 19:41   #4
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

в дополнение к ответам _Bers и 8Observer8.
Сразу не посмотрел ответы и сам решил поискать решение.
В общем-то я написал, для того, чтобы разжевать уже всё досконально.



Алгоритм макс уже придуман давно, он вошел в стандарт с++ 98
--------------------------------
Код:
template <class T> const T& max (const T& a, const T& b) {
  return (a<b)?b:a;     // or: return comp(a,b)?b:a; for version (2)
}
--------------------------------

Код:
// max example
#include <iostream>     // std::cout
#include <algorithm>    // std::max

int main () {
  std::cout << "max(1,2)==" << std::max(1,2) << '\n';
  std::cout << "max(2,1)==" << std::max(2,1) << '\n';
  std::cout << "max('a','z')==" << std::max('a','z') << '\n';
  std::cout << "max(3.14,2.73)==" << std::max(3.14,2.73) << '\n';
  return 0;
}
Вы надеетесь придумать более совершенный?

-------------ладно если по вашему то будет так:
Код:
#include <cstdlib>
#include <iostream>

namespace myIF
    {
        template <class T> const T& maxIF (const T& a, const T& b) 
            {
              if (a > b) return (a); 
                              else return (b);
            }
    }   
 using namespace std;
  using namespace myIF;
 

    
  
int main(int argc, char *argv[])
    {
          cout << "maxIF(1,2)==" << maxIF (1,2) << '\n';
       cout << "maxIF(2,1)==" << maxIF(2,1) << '\n';
       cout << "maxIF('a','z')==" << maxIF('a','z') << '\n';
     cout << "maxIF(3.14,2.73)==" << maxIF(3.14,2.73) << '\n';
      
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }

Последний раз редактировалось vvmcpp; 08.03.2014 в 20:44. Причина: добавление code
vvmcpp вне форума Ответить с цитированием
Старый 08.03.2014, 22:51   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Порча памяти:

Цитата:
Сообщение от vvmcpp Посмотреть сообщение
в дополнение к ответам _Bers и 8Observer8.
Сразу не посмотрел ответы и сам решил поискать решение.
В общем-то я написал, для того, чтобы разжевать уже всё досконально.



Алгоритм макс уже придуман давно, он вошел в стандарт с++ 98
--------------------------------
Код:
template <class T> const T& max (const T& a, const T& b) {
  return (a<b)?b:a;     // or: return comp(a,b)?b:a; for version (2)
}
--------------------------------

Код:
// max example
#include <iostream>     // std::cout
#include <algorithm>    // std::max

int main () {
  std::cout << "max(1,2)==" << std::max(1,2) << '\n';
  std::cout << "max(2,1)==" << std::max(2,1) << '\n';
  std::cout << "max('a','z')==" << std::max('a','z') << '\n';
  std::cout << "max(3.14,2.73)==" << std::max(3.14,2.73) << '\n';
  return 0;
}
Вы надеетесь придумать более совершенный?

-------------ладно если по вашему то будет так:
Код:
#include <cstdlib>
#include <iostream>

namespace myIF
    {
        template <class T> const T& maxIF (const T& a, const T& b) 
            {
              if (a > b) return (a); 
                              else return (b);
            }
    }   
 using namespace std;
  using namespace myIF;
 

    
  
int main(int argc, char *argv[])
    {
          cout << "maxIF(1,2)==" << maxIF (1,2) << '\n';
       cout << "maxIF(2,1)==" << maxIF(2,1) << '\n';
       cout << "maxIF('a','z')==" << maxIF('a','z') << '\n';
     cout << "maxIF(3.14,2.73)==" << maxIF(3.14,2.73) << '\n';
      
        cout << "Press the enter key to continue ...";
        cin.get();
        return EXIT_SUCCESS;
    }
Код:
namespace myIF
    {
        template <class T> const T& maxIF (const T& a, const T& b) 
            {
              if (a > b) return (a); 
                              else return (b);
            }
    }
Возвращает ссылку на локальный объект
_Bers вне форума Ответить с цитированием
Старый 10.03.2014, 20:49   #6
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Порча памяти:



Код:
namespace myIF
    {
        template <class T> const T& maxIF (const T& a, const T& b) 
            {
              if (a > b) return (a); 
                              else return (b);
            }
    }
Возвращает ссылку на локальный объект
В чем ошибка? Можно прояснить это утверждение? Где память портится?
В каких случаях не будет работать?
vvmcpp вне форума Ответить с цитированием
Старый 10.03.2014, 22:52   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от vvmcpp Посмотреть сообщение
В чем ошибка? Можно прояснить это утверждение? Где память портится?
В каких случаях не будет работать?
Я вроде бы по-русски написал: "возвращает ссылку на локальный объект". Это - причина.




Время жизни локального объекта - до конца области видимости функции.
Функция закончилась, все локальные объекты сдохли.

Память, которую они занимали - либо занята под другие объекты, либо там мусор. Это уж как повезет.

Если повезет - приложение свалиться сразу же. Проще потом будет понять причину краша.


Вы возвращаете ссылку на подохший объект.
Запомните раз и навсегда: никогда не возвращайте ссылки на локальные объекты.
_Bers вне форума Ответить с цитированием
Старый 10.03.2014, 23:08   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

@_Bers
Будьте любезны, укажите где там локальный объект.
waleri вне форума Ответить с цитированием
Старый 10.03.2014, 23:57   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

гм.. действительно. Значит я ошибся. Там нет локального объекта.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
cout., cin., cout.setf, cout.unsetf kineziz Общие вопросы C/C++ 1 06.05.2012 02:50
Cout!!!!! Notan1310 Общие вопросы C/C++ 8 26.01.2012 04:08
Компилятор не распознаёт cout. Якъ Помощь студентам 6 06.11.2010 21:14
Вопрос по cout (С++) EniOk Помощь студентам 2 06.12.2009 15:32