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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вызвать шаблонную функцию? 
V
    Опции темы
Gunslinger
Дата 16.11.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Как вызвать шаблонную функцию?
вариант 1:
Код

template<class T>
void setsomebody(T smb);

int main()
{
 string d;
 cin>>d;
  setsomebody(d);
};

Вариант 2:
Код

int main()
{
 string d;
 cin>>d;
  setsomebody<string>(d);
};

?
Например, dynamic_cast c <тип>, а в одной книжке примеры были, как в первом варианте. Так как правильно? 
PM MAIL   Вверх
azesmcar
Дата 16.11.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Gunslinger @  16.11.2009,  12:13 Найти цитируемый пост)
Например, dynamic_cast c <тип>, а в одной книжке примеры были, как в первом варианте. Так как правильно?  

И то и другое верно, в некоторых ситуациях вызов как в "вариант 1" невозможен, например
Код

template <class T>
T foo(){ ... }

int a = foo(); // неизвестен тип шаблона
int a = foo<int>(); // вызывается так

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

template <class T>
T foo(const T& r) { ... }

std::string f = foo("hello world"); // ошибка, передан const char*
std::string f = foo<std::string>("hello world"); // foo(std::string)


PM   Вверх
bsa
Дата 16.11.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



оба варианты правильные. Только второй, обычно, используется, когда параметром шаблона является возвращаемый тип, когда его невозможно определить из аргументов функции. Например:
Код
template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator out);
template<class Output, class Input>
Output my_cast(Input input);
copy(arr.begin(), arr.end(), std::ostream_iterator<std::string>(std::cout, "\n");
std::string x = my_cast<std::string>(10);

PM   Вверх
Gunslinger
Дата 16.11.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



azesmcar, 
bsa, 
понятно. Значит для собственного удобства могу писать с <>.

Цитата(azesmcar @  16.11.2009,  12:19 Найти цитируемый пост)
во втором же случае тип берется из переданного аргумента, но и в этих ситуациях иногда бывает нужно указать тип шаблона явно.
Код

template <class T>
T foo(const T& r) { ... }
std::string f = foo("hello world"); // ошибка, передан const char*


Функция сгенерируется с return T; // string. Компилятор сам не сравнивает, какой тип вернулся и переменной какого типа он присваивается?

Это сообщение отредактировал(а) Gunslinger - 16.11.2009, 12:49
PM MAIL   Вверх
bsa
Дата 16.11.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gunslinger @  16.11.2009,  12:48 Найти цитируемый пост)
Компилятор сам не сравнивает, какой тип вернулся и переменной какого типа он присваивается?
сравнивает, но для других целей.

PM   Вверх
azesmcar
Дата 16.11.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Gunslinger @  16.11.2009,  12:48 Найти цитируемый пост)
Компилятор сам не сравнивает, какой тип вернулся и переменной какого типа он присваивается?

нет
PM   Вверх
Gunslinger
Дата 16.11.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



bsa, 
azesmcar, 
ладно, явно указывать нужно.
Спасибо за помощь!
PM MAIL   Вверх
bsa
Дата 16.11.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gunslinger @  16.11.2009,  12:59 Найти цитируемый пост)
ладно, явно указывать нужно.
нужно там, где нужно. А там где не нужно, указывать не надо. Короче, не указывай, если компилятор заругается - укажи. Потом, будешь сам определять автоматически, когда указывать, а когда нет.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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