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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2011, 21:25   #1
pwturbenn
Новичок
Джуниор
 
Регистрация: 07.01.2011
Сообщений: 2
По умолчанию Шаблонные функции c++, кастование

Имеется шаблонная функция

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

вызываем ее со следующими аргументами:
max('a',3);

вызовется:
max<int>(int('a'),3)

вопрос: почему не
max<char>('a',char(3)) ?

и вообще, чем пользуется компиллятор когда выносит решение в подобной ситуации?
pwturbenn вне форума Ответить с цитированием
Старый 07.01.2011, 21:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не знаток компилятора си, но любой символ - число, он же код символа. потому его все равно придется хранить в виде числа.
if(a<b) - ведь не символы сравнивает, а их коды, потому компилятор и приводит к типу, который максимально удобно подходит для процессора чтоб сравнивать.
Если код а минус код б дает положительное число то а больше б, отрицательное - меньше, ноль - они равны. Но, заметь, операция сравнения - банальное вычитание целых.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2011, 21:40   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

по умолчанию численные константы, имеют тип int(символы в '' тоже число)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.01.2011, 21:58   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
#include <iostream>
#include <typeinfo>

using namespace std;

template <typename T, typename U>
void foo(T t, U u)
{
	cout << typeid(t).name() << endl;
	cout << typeid(u).name() << endl;
}

int main()
{
	foo('c', 1);
	return 0;
}
первый - char, второй - int. как и должно быть. в ansi c действительно, константный литерал символа приводился к int. (даже его размер был равен размеру int). в плюсах не так
небось пользуешься микрософтским компилятором

не заметил, что у тебя один шаблонный параметр. такая функйия напрямую вообще не должна была вызваться. передаешь 2 разных типа, а работаешь, как с одним и тем же.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 07.01.2011 в 22:05.
pproger вне форума Ответить с цитированием
Старый 07.01.2011, 22:15   #5
pwturbenn
Новичок
Джуниор
 
Регистрация: 07.01.2011
Сообщений: 2
По умолчанию

Цитата:
не заметил, что у тебя один шаблонный параметр. такая функйия напрямую вообще не должна была вызваться. передаешь 2 разных типа, а работаешь, как с одним и тем же.
Да, я только что это тоже увидел. Действительно - с одним вызываться не должна.


Но в общем суть я уловил - спасибо!
pwturbenn вне форума Ответить с цитированием
Старый 07.01.2011, 22:18   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2pwturbenn
ну она вызывается только потому, что константный литерал кастуется к int, как это было в ansi c.
попробуй вызвать так
char a = 'a';
max(a,3);
должен обломаться. иначе я не пойму, чем руководствовались разработчики твоего компиля)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шаблонные функции, как помочь компилятору выбрать определенную. Пепел Феникса Общие вопросы C/C++ 19 08.12.2010 13:47
Шаблонные функции в классе Impuls1989 Общие вопросы C/C++ 5 20.09.2010 09:04
вложенные шаблонные классы pproger Общие вопросы C/C++ 6 07.08.2010 21:20
Почему нельзя разбивать на отдельные файлы шаблонные функции и классы? lordius Visual C++ 22 08.07.2010 09:49
шаблонные строковые функции MrKarapuz Общие вопросы C/C++ 7 09.11.2009 15:07