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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Stasito
0 / 0 / 0
Регистрация: 08.12.2011
Сообщений: 25
#1

не удается релизовать свою функцию sort для шаблонного массива - C++

06.06.2013, 20:50. Просмотров 830. Ответов 22
Метки нет (Все метки)

функция должна получать Array<T>::Iterator

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
#ifndef SORT_H
#define SORT_H
 
 
#include <iostream>
//#include <string>
#include "Array.h"
//using namespace std;
//template <class T>
//void sort(class Array<T>::Iterator start,class Array<T>::Iterator end);
 
template <class Iterator >
 void sort( Iterator start,Iterator end)
{
    for(;start!=end;start++)
    {
        for( Iterator it=start+1;it!=end;it++)
                {
                    if(*start>*it)
                    {
                        Iterator temp=start;
                        start=it;
                        it=temp;
                    }
                }
    }
}
 
#endif
ошибка:
make all
Building file: ../Menu.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"Menu.d" -MT"Menu.d" -o "Menu.o" "../Menu.cpp"
../Menu.cpp: In member function 'void Menu::start()':
../Menu.cpp:19: error: call of overloaded 'sort(Array<int>::Iterator, Array<int>::Iterator)' is ambiguous
../sort.h:19: note: candidates are: void sort(Iterator, Iterator) [with Iterator = Array<int>::Iterator]
/usr/include/c++/4.2.1/bits/stl_algo.h:2816: note: void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = Array<int>::Iterator]
make: *** [Menu.o] Error 1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 20:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос не удается релизовать свою функцию sort для шаблонного массива (C++):

Написать функцию sort() для сортировки массива структур - C++
Напишите пожалуйста программу по заданию,не могу понять как делать. Условие программы: Напишите функцию sort() для сортировки...

Написать функцию Quick Sort для массива с 2000 элементов - C++
Написать функцию Quick Sort. Использовать написанную функцию для сортировки массива типа double на 2000 элементов. Нужна помощь:-|

Выбор шаблонного варианта для аргумента-массива - C++
По стопам оффтопа в теме решил создать свою. Для ускорения прояснения ситуации, так сказать. Имеем код: #include &lt;iostream&gt; ...

Как правильно использовать sort() для сортировки массива? - C++
Хочу отсортировать массив char ch, можно ли это сделать с помощью стандартной библиотеки или обязательно использовать strcmp?? ...

Не удается подключить к приложению gtest и свою статическую либу VS 2010 - C++
Здравствуйте, господа. Возникла проблема с линкером в VS 2010 после подключения к консольному приложению собственной же статической...

Как определить дружественную функцию шаблонного класса? - C++
Подскажите, пожалуйста, как определить дружественную функцию какого-то определенного шаблона? // например, делая это таким...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
06.06.2013, 21:55 #16
Stasito, тогда как получается конфликт с std::sort?
Stasito
0 / 0 / 0
Регистрация: 08.12.2011
Сообщений: 25
06.06.2013, 22:04  [ТС] #17
gray_fox,
не знаю наверное из-за using namespace std; в Menu.h но его убрать нелзя
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
06.06.2013, 22:06 #18
Stasito, просто где то включается std::sort. Я пока из стандартных заголовков вижу только iostream, с ним прблем нет: http://ideone.com/8guHou .
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
06.06.2013, 22:07 #19
MyIterator.h
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef _MYITERATOR_H_
#define _MYITERATOR_H_
#include <iterator>
 
template <typename T>
class MyIterator
{
public:
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    typedef std::forward_iterator_tag iterator_category;
    typedef ptrdiff_t difference_type;
 
    // конструкторы
    MyIterator();
    MyIterator(T *);
    MyIterator(const MyIterator &);
    // оператор присваиваний
    MyIterator& operator =(const MyIterator &);
 
    // сдвиги операторов
    MyIterator& operator ++();    // префиксный инкремент
    MyIterator  operator ++(int); // постфиксная инкремент
 
    // операторы обращения
    T& operator *();
    T* operator ->();
 
    // операторы сравнения
    bool operator ==(const MyIterator &);
    bool operator !=(const MyIterator &);
 
private:
    T* current;
};
 
 
template <typename T>
MyIterator<T>::MyIterator() : current(0)
{}
 
template <typename T>
MyIterator<T>::MyIterator(T* curr) : current(curr)
{}
 
template <typename T>
MyIterator<T>::MyIterator(const MyIterator& other) : current(other.current)
{}
 
template <typename T>
MyIterator<T>& MyIterator<T>::operator =(const MyIterator& other)
{
    // исключаем присваивание самому себе
    if (this != &other)
        current = other.current;
 
    return *this;
}
 
//префиксная версия возвращает значение после инкремента
template <typename T>
MyIterator<T>& MyIterator<T>::operator ++()
{
    ++current;
    return *this;
}
 
//постфиксная версия возвращает значение до инкремента
template <typename T>
MyIterator<T> MyIterator<T>::operator ++(int)
{
    MyIterator tmp(*this);
    operator++();
    return tmp;
}
 
template <typename T>
T& MyIterator<T>::operator *()
{
    return *current;
}
 
template <typename T>
T* MyIterator<T>::operator ->()
{
    return current;
}
 
template <typename T>
bool MyIterator<T>::operator ==(const MyIterator &other)
{
    return current == other.current;
}
 
template <typename T>
bool MyIterator<T>::operator !=(const MyIterator &other)
{
    return !(*this == other);
}
 
#endif
Array.h
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef _ARRAY_H_
#define _ARRAY_H_
#include <cstddef>
#include <algorithm>
#include <stdexcept>
#include "MyIterator.h"
 
template <typename T>
class Array
{
public:
    typedef MyIterator<T> iterator;
    typedef const MyIterator<T> const_iterator;
    typedef size_t size_type;
    typedef T* pointer;
    typedef const T* const_pointer;
    typedef T& reference;
    typedef const T& const_reference;
    typedef T value_type;
 
    // конструкторы
    Array();
    Array(const size_t size);
    Array(const Array &);
    // оператор присвоений
    Array& operator =(const Array &);
    // деструктор
    ~Array();
 
    // итераторы начала и конца контейнера
    MyIterator<T> begin() const;
    MyIterator<T> end() const;
 
    // операторы доступа
    T& operator [](size_t );
    const T& operator [](size_t ) const;
 
    // прочие методы
    size_t size() const;
    bool empty() const;
 
private:
    void swap(Array &, Array &);
    T* arr_;
    size_t sz_;
};
 
 
 
template <typename T>
Array<T>::Array() : arr_(new T[0]), sz_(0)
{}
 
template <typename T>
Array<T>::Array(const size_t sz) : arr_(new T[sz]), sz_(sz)
{
    // вызываем конструкторы для каждого элемента
    std::fill(arr_, arr_ + sz_, T());
}
 
template <typename T>
Array<T>::Array(const Array& arr)
{
    sz_ = arr.sz;
    arr_ = new T[sz_];
    // копируем элементы в новый контейнер
    std::copy(arr.arr_, arr.arr_ + sz_, arr_);
}
 
template <typename T>
Array<T>& Array<T>::operator =(const Array& arr)
{
    // исключаем работу при присваивании самому себе
    if (this != &arr)
    {
        Array tmp(arr);
        swap(tmp);
    }
    return *this;
}
 
template <typename T>
Array<T>::~Array()
{
    delete[] arr_;
}
 
template <typename T>
MyIterator<T> Array<T>::begin() const
{
    return MyIterator<T>(arr_);
}
 
template <typename T>
MyIterator<T> Array<T>::end() const
{
    return MyIterator<T>(arr_ + sz_);
}
 
template <typename T>
T& Array<T>::operator [](size_t index)
{
    if (index >= sz_)
        throw std::out_of_range("Array subscript out of range");
    return arr_[index];
}
 
template <typename T>
const T& Array<T>::operator [](size_t index) const
{
    if (index >= sz_)
        throw std::out_of_range("Array subscript out of range");
    return arr_[index];
}
 
template <typename T>
size_t Array<T>::size() const
{
    return sz_;
}
 
template <typename T>
bool Array<T>::empty() const
{
    return sz_ == 0;
}
 
template <typename T>
void Array<T>::swap(Array& first, Array& second)
{
    std::swap(first.arr_, second.arr_);
    std::swap(first.sz_, second.sz_);
}
 
#endif
Добавлено через 55 секунд
gray_fox, как ни странно, иногда std::sort подключается через iostream oO Точного компилера сказать не могу, помню, что такое было
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
06.06.2013, 22:10 #20
Цитата Сообщение от MrGluck Посмотреть сообщение
gray_fox, как ни странно, иногда std::sort подключается через iostream
Ну тогда тут ничем ни помочь...
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
06.06.2013, 22:10 #21
gray_fox, а вот и пруф
не удается релизовать свою функцию sort для шаблонного массива
Stasito
0 / 0 / 0
Регистрация: 08.12.2011
Сообщений: 25
06.06.2013, 22:59  [ТС] #22
MrGluck,
не удастся никак сделать overload или override функции?

Добавлено через 26 минут
gray_fox,
MrGluck,
thank you vey much for your help and sorry for disturbing...
Very strange thing,i worked with ECLIPSE on Mac and have errors
Now i run the same code on Visual Studio in Windows and it is work properly
I am very sorry for disturbing
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
07.06.2013, 00:19 #23
Цитата Сообщение от Stasito Посмотреть сообщение
не удастся никак сделать overload или override функции?
Так то можно перегрузить, только типы аргументов шаблона ф-ии не должны быть зависимыми от параметра шаблона, иначе вывод типа невозможен.
http://ideone.com/CEIRKC
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 00:19
Привет! Вот еще темы с ответами:

Вызов метода у шаблонного поля, шаблонного класса - C++
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Как прописать шаблонную функцию внутри шаблонного класса? - C++
Как объявить шаблонную функцию/*типа iterator*/ внутри шаблонного класса?

Преобразовать функцию strcmp в СВОЮ функцию - C++
Нужно заменить функцию strcmp на свою. я создала свою, но код не коректний и выбивает ошибки. #include &lt;iostream&gt; #include &lt;stdio.h&gt;...

В функцию sort не передается значения массива из другой функции - Pascal
Подскажите пжлст почему в процедуру sort не передаются значения массива из процедуры vyb var z: integer; const n = 1000; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.06.2013, 00:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru