Указание параметра шаблона с помощью Typedef - PullRequest
2 голосов
/ 06 октября 2011

Я хочу иметь возможность передавать два соединенных итератора как один, чтобы использовать преимущества некоторых stl-подобных алгоритмов (таких как TBB), поэтому я делаю собственный итератор, который присоединяется к ним, но поражает некоторые камни преткновения.

Мне нужно специализировать итератор, однако он не позволит мне в общем случае указать параметр шаблона.

Вот так:

template<typename IT1, typename IT2>
struct multi_iter : public std::iterator<
                            std::output_iterator_tag,
                            std::pair<IT1::value_type&, IT2::value_type&> >
{
.
:

Однако это позволит мне сделать это, но это не то, что я хочу после

template<typename IT1, typename IT2>
struct multi_iter : public std::iterator<
                            std::output_iterator_tag,
                            std::pair<int&, int&> >
{
.
:

Я получаю эту ошибку

multi_iter.cpp:12:53: error: template argument 2 is invalid
multi_iter.cpp:12:55: error: template argument 2 is invalid
multi_iter.cpp:12:55: error: template argument 4 is invalid
multi_iter.cpp:12:55: error: template argument 5 is invalid
.
:

У меня есть пара std ::

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

value_type является зависимым типом для IT1, поэтому вы должны указать typename там

typename IT1::value_type
1 голос
/ 06 октября 2011

Вы пробовали это?

template<typename IT1, typename IT2>
struct multi_iter : public std::iterator<
                            std::output_iterator_tag,
                            std::pair< typename IT1::value_type&, typename IT2::value_type& > >
{
.
:
1 голос
/ 06 октября 2011
template<typename IT1, typename IT2>
struct multi_iter : public std::iterator<
                            std::output_iterator_tag,
                            std::pair<IT1::value_type&, IT2::value_type&> >

IT1::value_type зависит от параметра типа и является типом, поэтому его необходимо обозначить ключевым словом typename:

template<typename IT1, typename IT2>
struct multi_iter : public std::iterator<
                            std::output_iterator_tag,
                            std::pair<typename IT1::value_type&, typename IT2::value_type&> >

Кстати, если вы хотите "сжать" два итератора (то есть итерировать две последовательности {1, 2} и {"a", "b"}, как (1, "a"), то (2, " b ")), посмотрите на zip_iterator из библиотеки boost.iterators .

...