使用 Typedef 指定模板参数

发布于 2024-12-08 16:48:50 字数 1006 浏览 1 评论 0原文

我希望能够将两个连接的迭代器作为一个传递,以利用一些类似 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::pair

任何帮助将不胜感激。

谢谢

I want to able to pass two joined iterators as one to take advantage of some stl like algorithms (such as TBB) so I am making a custom iterator that joins them but am hitting some stumbling blocks.

I need to specialize iterator, however it won't let me generically specify a template parameter.

Like so:

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

However it will let me do this, but this is not what I am after

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

I get this error

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
.
:

I do have the std::pair

Any help would be greatly appreciated.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你与清晨阳光 2024-12-15 16:48:50

value_typeIT1 的依赖类型,因此您必须在那里指定 typename

typename IT1::value_type

value_type is a dependent type on IT1, so you have to specify typename there

typename IT1::value_type
懒猫 2024-12-15 16:48:50

你试过这个吗?

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& > >
{
.
:

Have you tried this?

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& > >
{
.
:
_蜘蛛 2024-12-15 16:48:50
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"), then (2, "b")),看一下zip_iterator 来自 boost.iterators 库。

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 is dependent on a type parameter and is a type, so it needs to be designated by typename keyword:

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&> >

BTW if you want to "zip" two iterators (that is, iterate two sequences {1, 2} and {"a", "b"}, as (1, "a"), then (2, "b")), have a look at the zip_iterator from the boost.iterators library.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文