Частичная специализация шаблона класса с картами - PullRequest
1 голос
/ 28 февраля 2012

Я новый программист на C ++, я изучил Java и ANSI C некоторое время назад и решил попробовать его.

Что ж, я люблю C ++, но мне не понравилось, как работают итераторы:

В java вы можете сделать весь контейнер приватным и реализовать функцию getter для его итератора, и итератор имеет метод hasNext(), который возвращает логическое значение в зависимости от того, достиг ли он конца контейнера.

Единственный способ найти что-то похожее на C ++ - это написать 2 геттера, iteratorBegin() и iteratorEnd(), которые возвращают целое число, соответствующее первой и последней позициям, увеличивая итератор, возвращаемый на iteratorBegin() и сравнение с iteratorEnd() позволило мне перебирать контейнер до тех пор, пока не будет достигнута конечная позиция

Но я хочу использовать только ОДИН метод получения, и я подумал: «Давайте создадим свой собственный итераторкласс "

Пока все хорошо, я успешно справился с наборами и списками, но я не могу сделать это с помощью карт, вот код, который меня беспокоит:lass определяется в отдельном .h, это называется customIterator.cpp)

template<typename T, typename D>
const D& custIterator<T,D>::next()
{
    const D& obj = (*it);
    if(hasNext())
    {
        it++;
    }
    return obj;
}

//the above works fine

template<typename T, typename D>
const D& custIterator<map<T,D>,D>::next() //error in this line
{
    D& obj = (*it).second; 
    if(hasNext())
    {
        it++;
    }
    return obj;
}

при компиляции специализированного метода, он говорит: ошибка: 'map' не было объявлено в этой области, даже если я добавил #include <map> поверх файла

Я использую gcc версии 4.4.5 (Debian 4.4.5-8) с кодовыми блоками

Пожалуйста, мне нужна помощь.

Спасибо за внимание!

1 Ответ

5 голосов
/ 28 февраля 2012

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

std::map<T,D>

В общем, я бы рекомендовал не пытаться переносить идиомы Java в C ++, поскольку каждый язык имеет свои собственные идиомы, и их смешивание может запутать других программистов (точно так же, как я думаю, что #define BEGIN { не самая лучшая идея).

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

Дополнительное чтение или tl; др. Слайды (есть видео, которое я не могу найти в данный момент).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...