В проекте есть такие три файла:
http://pastebin.com/DFTqFqGc (segtree.h)
http://pastebin.com/vYu1AYCa (segtree.cpp)
http://pastebin.com/qAq8ALHi (main.cpp)
Компилятор выводит ошибки:
c:\documents and settings\admin\мои документы\visual studio 2010\projects\segmenttree\segmenttree\seqtree.cpp(49): error C2953: 'SegmentTree' : class template has already been defined
c:\documents and settings\admin\мои документы\visual studio 2010\projects\segmenttree\segmenttree\segtree.h(6) : see declaration of 'SegmentTree'
'max' is not a valid template type argument for parameter 'Func'
Какое слово ставить перед Func в определении шаблона и почему возникает первая ошибка?
Я же вроде бы не определяю, а только объявляю класс?
Я сейчас еще покопался в template'ах, передать функцию как параметр шаблона не получилось. Обычные типы - пожалуйста, а вот сложную функцию - нет.
- убей segtree.h
- убери #include "segtree.h" в segtree.cpp
- переименуй segtree.cpp в segtree.h
- допиши в новом segtree.h необходимые для его функционирования #include <vector> и #include <algorithm>
- разберись с неизвестной переменной t в методе SegTree::get
Второе. Две функции по одному имени ты не передашь никуда и никогда. В твоем случае напрашивается такой вот класс:Далее, заменить SegmentTree<int, max> на <int, maximum>.
При этом все продолжает ругаться. Объясняю, почему. В определении SegmentTree<Item, Func> Func должно быть типом, а не значением (это поэтому тебе ругались на твой max), а ты к нему обращаешься как к классу. То есть, Func(a, b) - это не вызов функции, а вызов конструктора класса. Поэтому надо в определении SegmentTree добавить следующую строку:
Func func;
и все "вызовы" Func(a, b) надо заменить на func(a, b) - что действительно будет вызовом функции.
В std::sort и иже с ними тип компаратора выводится, поэтому не надо указывать всякие int (*) (int, int).
Ниже написал, как писать функции с автовыводом такой хрени.