[c++] как при вызове шаблонной функции указать параметры?

pitrik2

вот так компиляется и работает:

#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include <vector>

template<typename K, typename V>
V secondUnary(typename std::pair<K, V> it) {
return it.second;
}

template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
_OutputIterator tr (_InputIterator first, _InputIterator last,
_OutputIterator result, _UnaryOperation op)
{
while (first != last) *result++ = op(*first++);
return result;
}

int main(int argc, const char *argv[]) {
std::map<std::string, std::string> base;
base["lala"] = "foo";
base["upsups"] = "bar";

std::vector<std::string> result;
result.resize(base.size;

tr
// <
// std::map<std::string, std::string>::const_iterator,
// std::vector<std::string>::iterator,
// std::string(std::pair<const std::string, std::string>)
// >
(base.begin base.end result.begin secondUnary<const std::string, std::string> );

for(int i = 0; i < result.size; i++) {
std::cout << "next: " << result[i] << std::endl;
}

return 0;
}

если раскомментировать строчки то перестает компиляться
подозреваю что ошибка в указании третьего парамтра
как это сделать правильно?
и второй вопрос
правильно ли я вообще определил унарную функцию secondUnary?
может это лучше немного по-другому делать?

ppplva

У тебя это функция, а не класс. Должен быть класс, такой что его объекты прикидываются функциями.

pitrik2

У тебя это функция, а не класс. Должен быть класс, такой что его объекты прикидываются функциями.
моя твоя не понимает :(
да у меня функция
как сделать класс это вроде ежу понятно
что значит "должен"? ты хочешь сказать что по стандарту в шаблон нельзя функцию передавать? но ведь оно компиляется и работает
или имеется ввиду что такой шаблон потом нельзя будет явно указать? (кстати есть какиенить правильные слова вместо "явно указать"?)
фигня какая-то, компилятор же раскрывая шаблон всё равно же должен описание его построить...

barbos

Какой компилятор?
У меня на g++ 4.4.2 компилируются оба варианта (с опциями -W -Wall никаких специфических warnings нет).
Также компилируется в варианте:
 
  tr
<
std::map<std::string, std::string>::const_iterator,
std::vector<std::string>::iterator,
std::string (*std::pair<const std::string, std::string>)
>
(base.begin base.end result.begin secondUnary<const std::string, std::string> );

Который, кажется, больше подходит.

Andbar

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Оба варианта скомпилировались без ошибок. С /Wall руганулось на сравнение signed и unsigned, а также на заголовок main (плюс несколько ошибок в библиотечных заголовках).
Кстати, комментировать в таких случаях, имхо, лучше с помощью директив
#if 0
#endif

Dasar

Кстати, комментировать в таких случаях, имхо, лучше с помощью директив
почему?
// - нагляднее

ppplva

Да, я туплю. Выше правильно написали, тип "указатель на функцию" объявляется как "ret (*nameargs)", или без имени, если анонимный.

pitrik2

У меня на g++ 4.4.2 компилируются оба варианта (с опциями -W -Wall никаких специфических warnings нет).
у меня сановский CC не компиляет если раскомментить
а g++ версии 2.95.2 компиляет, но при запуске корка

pitrik2

(*)
блин
я тормоз
так заработало :)

pitrik2

Кстати, комментировать в таких случаях, имхо, лучше с помощью директив
#if 0
#endif
ой мама
что за ужас?
зачем такое?
у меня даж среда моя (vim и IDEA) такое не поддерживает, а обучать её такому замучаешься
так я выделил блок и нажал ctrl+/

erotic

Оба варианта скомпилировались без ошибок.
Оххо.
А что за объявление типа 'std::string(std::pair<const std::string, std::string>)' ? Так же ни указатель на функцию не объявить, ни структуру, вообще ничего, по-моему.

kokoc88

Так же ни указатель на функцию не объявить, ни структуру, вообще ничего, по-моему.
Это сигнатура функции, которая получает один аргумент типа std::pair<const std::string, std::string> и возвращает std::string
Поддерживается не всеми компиляторами, в частности "Sun WorkShop 6 update 2 C++ 5.3" это не поддерживает.
Оставить комментарий
Имя или ник:
Комментарий: