My First Go с шаблонами функций - PullRequest
2 голосов
/ 24 апреля 2010

Думаю, это было довольно просто.

Но я получаю "итератор без разыменования" при выполнении кода ниже.

Что не так?

template<typename T>
struct SumsTo : public std::binary_function<T, T, bool>
{
    int myInt;
    SumsTo(int a)
    {
        myInt = a;
    }
    bool operator()(const T& l, const T& r)
    {   
        cout << l << " + " << r;
        if ((l + r) == myInt)
        {
            cout << " does add to " << myInt;
        }
        else 
        {
            cout << " DOES NOT add to " << myInt;
        }
        return true;
    }
};

void main()
{
    list<int> l1;
    l1.push_back(1);
    l1.push_back(2);
    l1.push_back(3);
    l1.push_back(4);

    list<int> l2;
    l2.push_back(9);
    l2.push_back(8);
    l2.push_back(7);
    l2.push_back(6);

    transform(l1.begin(), l1.end(), l2.begin(), l2.end(), SumsTo<int>(10) );
}

Ответы [ 2 ]

4 голосов
/ 24 апреля 2010

Ваш функтор в порядке. Проблема в звонке на transform.

Преобразование имеет прототип

transform(_InputIterator1 __first1, _InputIterator1 __last1,
          _InputIterator2 __first2, _OutputIterator __result,
          _BinaryOperation __binary_op)

Ваш звонок

transform(l1.begin(), l1.end(), l2.begin(), l2.end(), SumsTo<int>(10) );

вместо l2.end(), четвертый аргумент итератора должен быть началом последовательности результатов. Он должен ссылаться на последовательность объектов, которые вы можете построить из bool.

Если вы хотите сохранить результаты в l2, тогда вы хотите

transform(l1.begin(), l1.end(), l2.begin(), l2.begin(), SumsTo<int>(10) );

Как предполагает GMan, другой подход - std::back_inserter из <iterator>:

vector<bool> sums10; // vector<bool> is Good Enough for Me
transform(l1.begin(), l1.end(), l2.begin(), back_inserter(sums10), SumsTo<int>(10) );
0 голосов
/ 24 апреля 2010

Как указал Potatoswatter, transform имеет прототип

transform(_InputIterator1 __first1, _InputIterator1 __last1,
          _InputIterator2 __first2, _OutputIterator __result,
          _BinaryOperation __binary_op)

Это означает, что первые два аргумента указывают диапазон. В вашем случае l1.begin(), l1.end()

Следующий аргумент является отправной точкой следующего списка: l2.begin()

Четвертый аргумент в том, где ваша проблема. Он запрашивает итератор «output» или куда-нибудь поместить результат вашей работы. Вместо этого вы указываете конец второго списка.

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

//...
list<bool> l3;

transform(l1.begin(), l1.end(), l2.begin(), back_inserter(l3), SumsTo<int>(10));

Если это не скомпилируется, попробуйте добавить #include <iterator>

Что делает back_inserter, так это создает итератор, который при записи (и это делает его «итератором вывода») делает push_back со значением, которое он передает контейнеру, который вы передаете.

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