ошибка возврата std :: set <T>:: iterator в шаблон - PullRequest
5 голосов
/ 13 октября 2009

Я делаю шаблонную оболочку вокруг std :: set. Почему я получаю ошибку для объявления функции Begin ()?

template <class T>
class CSafeSet
{
    public:
        CSafeSet();
        ~CSafeSet();

        std::set<T>::iterator Begin();

    private:
        std::set<T> _Set;
};

ошибка: тип ‘std :: set, std :: allocator <_CharT>> ’не является производным от типа‘ CSafeSet ’

1 Ответ

17 голосов
/ 13 октября 2009

Попробуйте typename :

template <class T>
class CSafeSet
{
    public:
        CSafeSet();
        ~CSafeSet();

        typename std::set<T>::iterator Begin();

    private:
        std::set<T> _Set;
};

Вам нужно typename, потому что оно зависит от шаблона T. Более подробную информацию можно найти по ссылке над кодом. Многое из этого становится проще, если вы используете typedef:

template <class T>
class CSafeSet
{
    public:
        typedef T value_type;
        typedef std::set<value_type> container_type;
        typedef typename container_type::iterator iterator_type;
        typedef typename container_type::const_iterator const_iterator_type;

        CSafeSet();
        ~CSafeSet();

        iterator_type Begin();

    private:
        container_type _Set;
};

В дополнение к этому, если вы хотите завершить, вам нужно разрешить CSafeSet делать то же самое, что набор мог бы , что означает использование собственного компаратора и распределителя:

template <class T, class Compare = std::less<T>, class Allocator = std::allocator<T> >
class CSafeSet
{
    public:
        typedef T value_type;
        typedef Compare compare_type;
        typedef Allocator allocator_type;

        typedef std::set<value_type, compare_type, allocator_type> container_type;
        typedef typename container_type::iterator iterator_type;
        typedef typename container_type::const_iterator const_iterator_type;

        // ...
}

И последний совет: если вы собираетесь создать оболочку для класса, попробуйте следовать тем же соглашениям об именах, что и для класса. То есть ваш Begin(), вероятно, должен быть begin() (И лично я думаю, что C перед именем класса странно, но это ваше дело:])

...