имплементация шаблона класса с++

279
29 декабря 2017, 01:02

Привет, у меня, прошу объяснять следующие задание: у меня есть flat_set.hpp, где находится класс шаблон flat_set, который нужно наимплементовать в том же файл. Я никогда не встречался с шаблонами и сейчас нахожусь в большом затруднении, как приступить к задаче.

#include <iterator>
#include <unordered_map>
template <typename T, typename Comparator>
class flat_set {
public:
// These types need to be accesible from the outside:
// iterator
// const_iterator
// size_type
// value_type
// Special member functions
flat_set();
flat_set(Comparator const& cmp);
flat_set(flat_set const& rhs);
flat_set(flat_set && rhs);
flat_set& operator=(flat_set const& rhs);
flat_set& operator=(flat_set && rhs);
~flat_set();
// Constructs flat_set from elements in range [first, last)
template <typename InputIterator>
flat_set(InputIterator first, InputIterator last);
template <typename InputIterator>
flat_set(InputIterator first, InputIterator last, Comparator const& cmp);

// Insert overloads
std::pair<iterator, bool> insert(T const& v);
std::pair<iterator, bool> insert(T&& v);
// Inserts [first, last) range of elements
template <typename InputIterator>
void insert(InputIterator first, InputIterator last);
// Erase overloads
// Deletes element pointed-to by i, returns iterator to the next element
iterator erase(const_iterator i);
// Deletes elements in range [first, last), returns iterator to the next element
iterator erase(const_iterator first, const_iterator last);
// Deletes element equal to key if it is present, returns how many elements were deleted
size_type erase(value_type const& key);
// Iterator member functions
iterator begin() noexcept;
iterator end() noexcept;
const_iterator begin() const noexcept;
const_iterator end() const noexcept;
const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
// The usual queries
bool empty() const;
size_type size() const;
size_type capacity() const;
void reserve(size_type c);
void clear();
// Lookup member functions
// Returns iterator to element equivalent to v, or an end iterator if such element is not present
iterator find(T const& v);
const_iterator find(T const& v) const;
// Returns iterator to first element that is not less than t, end iterator if no such element is present
iterator lower_bound(T const& t);
const_iterator lower_bound(T const& t) const;
// Returns iterator to first element that is greater than t, end iterator if no such element is present
iterator upper_bound(T const& t);
const_iterator upper_bound(T const& t) const;
void swap(flat_set& o);
};
// Lexicographical comparisons
bool operator==(flat_set const& a, flat_set const& b);
bool operator!=(flat_set const& a, flat_set const& b);
bool operator<(flat_set const& a, flat_set const& b);
bool operator<=(flat_set const& a, flat_set const& b);
bool operator>=(flat_set const& a, flat_set const& b);
bool operator>(flat_set const& a, flat_set const& b);
template <typename T>
void swap(flat_set<T> const& a, flat_set<T> const& b);

Вопросы:

1)как подключить iterator, const_iterator, size_type, value_type - (в idea помечает - сant resolve type )?

2) реализацию методов можно спокойно делать в самом .hpp файле?

Answer 1
  Я написал вам ту часть кода, где отвечаю на ваш  первый вопрос
и где я исправил ошибки начиная с того, что если вы хотите представить
класс одним аргументом шаблона, то второй должен иметь значение по
умолчанию... И я привел один из вариантов(самый простой).
Обратите внимание на то, чем отличаются мои строки от ваших, и если
возникнут вопросы, тогда напишу пояснения...
    template <typename T, typename Comparator = std::less<T> >
class flat_set {
public:
    typedef T*              iterator;
    typedef const T*        const_iterator;
    typedef T               value_type;
    typedef Comparator      compare_type;
    typedef size_t          size_type;
    typedef typename  std::iterator_traits<T*>::difference_type   difference_type;
    // Special member functions
};
// Lexicographical comparisons
template < class Tp, class C>
bool operator==(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template < class Tp, class C>
bool operator!=(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template < class Tp, class C>
bool operator<(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template < class Tp, class C>
bool operator<=(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template < class Tp, class C>
bool operator>=(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template < class Tp, class C>
bool operator>(const flat_set<Tp, C>&  a, const flat_set<Tp, C>& b);
template <typename T>
void swap(flat_set<T>& a,  flat_set<T>& b);
READ ALSO
Вычисление функции c помощью ряда Тейлора

Вычисление функции c помощью ряда Тейлора

Вещественная функция может быть представлена рядом Тейлора, радиус сходимости которого определяется положением особых точек функцииЛюбой...

268
Перегрузка оператора &ldquo;-&rdquo;

Перегрузка оператора “-”

ЗдравствуйтеЗадача: создать класс символьной строки и несколько объектов разработанного класса (a,b,c)

233
Ошибка в JOGL при инициализации GLProfile

Ошибка в JOGL при инициализации GLProfile

Запускаю приложение JOGL в NetBeans 81, в методе main одна строчка:

244