Форум программистов, компьютерный форум CyberForum.ru

Шаблоны. Древовидная сортировка - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка в программе http://www.cyberforum.ru/cpp-beginners/thread749778.html
Здравствуйте! Решал одну задачу. И возникла проблема при выводе результата в файл. Не могу понять, что не так, не могу понять почему не работает. Немного подправил, все равно не работает. Помогите пожалуйста разобраться. //----------------- #include <fstream> #include <string> using namespace std; ifstream cin("input.txt"); ofstream cout("output.txt"); string s, st; int h, i, j, k, pos;...
C++ Одномерные массивы. Поиск последовательностей Помогите с задачей !!! в с++ Объявить массив целых чисел и заполнить его случайными значениями. Рзмерность массива – 100, диапазон значений . Во всех последовательностях положительных чисел изменить порядок элементов на противоположный. http://www.cyberforum.ru/cpp-beginners/thread749769.html
Подсветка синтаксиса в Emacs C++
Скажите пожалуйста, как в Emacs сделать автоматическую подсветку кода С++ в файлах с расширением .h - там только C, а в файлах .cpp все нормально.
C++ Нахождение всех неотрицательных чисел, стоящих на четных местах в последовательности
=-O
C++ Составить алгоритм нахождения суммы наибольшего и наименьшего из заданных чисел http://www.cyberforum.ru/cpp-beginners/thread749744.html
:(:(
C++ составить алгоритм инвертирования ряда чисел , т.е. записи всех чисел заданного ряда в обратном порядке :cry: подробнее

Показать сообщение отдельно
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
29.12.2012, 21:00     Шаблоны. Древовидная сортировка
Реализую собственную версию древовидной сортировки на основе шаблонов. Нужно сравнение производить по объект функции. Тип шаблона -
C++
1
std::vector<std::pair<std::string, Test *> > Test
- некий абстрактный класс.
C++
1
2
3
4
5
6
7
8
9
10
class Test
{
    public:
        Test(); // конструктор по-умолчанию
        . . .
    protected:
        int day_;
        std::string month_;
        int year_;
};
Объект-функция
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class LessDate
{
    public:
        bool operator()(const std::pair<std::string, Test *> &,
                        const std::pair<std::string, Test *> &);
};
 
bool LessDate::operator()(const pair<string, Test *> &p1,
                          const pair<string, Test *> &p2)
{
    if (p1.second->getYear() == p2.second->getYear())
    {
        if (p1.second->getMonth() == p2.second->getMonth())
            return p1.second->getDay() < p2.second->getDay();
        else
            return p1.second->getMonth() < p2.second->getMonth();
    }
    else
        return p1.second->getYear() < p2.second->getYear();
}


Содержимое файла tree_sort.h с описанием функций:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef _TREE_SORT_H_
#define _TREE_SORT_H_
 
template <typename T>
struct Tree
{
    T a;         // данные
    Tree *left;  // левый  преемник
    Tree *right; // правый преемник
};
 
template <class Tree, typename T>
Tree* add_to_tree(Tree* root, T new_value);
 
template <class Tree, typename T>
void tree_to_vec(Tree* root, std::vector<T> &);
 
template <class Tree, typename T>
void sort_tree(std::vector<T> &v);
 
#endif


tree_sort.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
#include "tree_sort.h"
 
using namespace std;
 
 
template <class Tree, typename T>
Tree* add_to_tree(Tree* root, T new_value)
{
    if (!root) // если дошли до корня - создаем новый элемент
    {
        root = new Tree;
        root->a = new_value;
        root->left = root->right = 0;
        return root;
    }
 
    if (root->a < new_value)       // добавлем ветвь
        root->right = add_to_tree(root->right, new_value);
    else
        root->left  = add_to_tree(root->left,  new_value);
    return root;
}
 
template <class Tree, typename T>
void tree_to_vec(Tree* root, vector<T> &v) // процедура заполнения массива
{
    if (!root) return; // условие окончания - найден корень
    tree_to_vec(root->left, v); // обход левого поддерева
    v.push_back(root->a);
    tree_to_vec(root->right, v); // обход правого поддерева
    delete root;
}
 
template <class Tree, typename T>
void sort_tree(vector<T> &v) // собственно сортировка
{
   Tree *root = 0;
   for (T* it = v.begin(); it != v.end(); ++it) // заполнение дерева
      root = add_to_tree(root, *it);
   tree_to_vec(root, v); // заполнение массива
}


Вызов sort_tree:
C++
1
2
3
4
typedef std::vector<std::pair<std::string, Test *> > myVec;
myVec v;
// заполнение
sort_tree<myVec::value_type>(v);
Ругается на последнюю строку.
Код
undefined reference to `void sort_tree<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Test*>, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Test*> >(std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Test*>, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Test*> > >&)'|
Объект-функцию я даже пока не приделывал. Как правильно передавать тип в шаблонную функцию? Или в объявлении шаблонных функций накосячил?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru