【问题标题】:Specifying template parameter with a Typedef使用 Typedef 指定模板参数
【发布时间】:2011-10-06 19:41:36
【问题描述】:

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你没有专攻std::iterator。您必须从头开始编写整个迭代器类。
  • 请详细说明:我应该指出,当我指定整数时,这确实像它应该的那样工作
  • @KerrekSB,实际上,您可以专门化 std::iterator 以获得一些方便的 typedef:cplusplus.com/reference/std/iterator/iterator。你必须提供所有的功能实现。
  • KerrekSB:上面的代码示例被删减以保持相关性,我已经实现了 output_iterator 所需的所有功能

标签: c++ templates iterator c++11


【解决方案1】:

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

typename IT1::value_type

【讨论】:

  • 他的专长在哪里?
  • 我希望我的编译器可以告诉我::S。但是谢谢你解决了它:D
  • @111111 :有关为什么需要 typename 以及如何知道何时使用它的说明,请参阅此常见问题解答:What is the template typename keyword used for?
【解决方案2】:

你试过了吗?

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

【讨论】:

    【解决方案3】:
    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")),看看boost.iterators 库中的zip_iterator

    【讨论】:

    • 谢谢,我会看看 zip_iterator,我确实在寻找类似的东西。虽然 TBH 现在可以正常工作,并且反汇编显示它完全编译出来:D
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2019-08-24
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多