繁体   English   中英

当对于通用STL容器不知道迭代器的值类型时,如何使用模板化迭代器?

[英]How to use templated iterators when value type of iterator is not know for a generalised STL Container?

我想写模板化的函数

  • 接受2个迭代器
  • 使用* copy(在算法标准标头中定义)打印存储在容器中的内容。

这是我编写的代码,但是会产生编译错误

template <template<typename, typename> class Container, 
            typename Value, 
            typename Allocator = std::allocator<Value> >
void printContainer(Container<Value, Allocator>::iterator itBegin,
                    Container<Value, Allocator>::iterator itEnd)
{
        copy(itBegin, itEnd, ostream_iterator<Value>(cout, " "));
        cout << endl;
}

产生的错误是:

  error 1: variable or field ‘printContainer’ declared void
  void printContainer(Container<Value, Allocator>::iterator itBegin,
                                                   ^
  error 2: expected ‘)’ before ‘itBegin’
  void printContainer(Container<Value, Allocator>::iterator itBegin,
                                                            ^
  error 3: expected ‘)’ before ‘itEnd’
       Container<Value, Allocator>::iterator itEnd)
                                             ^
 p00441.cpp: In function ‘int main()’:
 p00441.cpp:10:39: error: ‘printContainer’ was not declared in this scope
   printContainer(inp.begin(), inp.end());

我写的另一个片段是

template<typename InputIterator>
void printContainer(InputIterator itBegin, InputIterator itEnd){
        //Trial 1
        copy(itBegin, itEnd, ostream_iterator< iterator_traits<ForwardIterator1>::value_type>(cout, " "));

        //Trial 2
        copy(itBegin, itEnd, ostream_iterator<value_type(itBegin)*>(cout, " "));
        cout << endl;
}

产生的错误是:

error 1: ‘ForwardIterator1’ was not declared in this scope
   copy(itBegin, itEnd, ostream_iterator< iterator_traits<ForwardIterator1>::value_type>(cout, " "));
                                                          ^
error 2: template argument 1 is invalid
   copy(itBegin, itEnd, ostream_iterator< iterator_traits<ForwardIterator1>::value_type>(cout, " "));
                                                                          ^
error 3: template argument 1 is invalid
   copy(itBegin, itEnd, ostream_iterator< iterator_traits<ForwardIterator1>::value_type>(cout, " "));
                                                                                       ^
error 3: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, class _CharT, class _Traits> class std::ostream_iterator’
   copy(itBegin, itEnd, ostream_iterator<value_type(itBegin)*>(cout, " "));
                                                             ^
error 4:   expected a type, got ‘(value_type(itBegin) * <expression error>)’

请详细说明错误的含义及其发生原因。 还建议如何实现期望的目标。

如果您能为新手提供一些了解迭代器的资源,我将不胜感激。

关于第一个问题,您可以简单地将iterator用作模板类型,并使用iterator::value_type

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>

using namespace std;

template <typename Iterator>
void printContainer(Iterator itBegin,
                    Iterator itEnd)
{
        copy(itBegin, itEnd, ostream_iterator<typename Iterator::value_type>(cout, " "));
        cout << endl;
}

int main() {
    vector<int> v{1, 2, 3, 4, 5, 6};
    list<int>   l{1, 2, 3, 4, 5, 6};
    printContainer(begin(v), end(v));
    printContainer(begin(l), end(l));

    return 0;
}

https://ideone.com/DhUQ1t

使用iterator_traits也是可行的并且是更好的解决方案,因为它也适用于指针(自然没有value_type成员;这要感谢Jarod42指出):

template <typename Iterator>
void printContainer(Iterator itBegin,
                    Iterator itEnd)
{
        copy(itBegin, itEnd, ostream_iterator<typename iterator_traits<Iterator>::value_type>(cout, " "));
        cout << endl;
}

https://ideone.com/8N0ook

从C ++ 14开始,您还可以使用decltypedecay_t

template <typename Iterator>
void printContainer(Iterator itBegin,
                    Iterator itEnd)
{
        copy(itBegin, itEnd, ostream_iterator<decay_t<decltype(*itBegin)>>(cout, " "));
        cout << endl;
}

https://ideone.com/7MBsiL


关于其他尝试,您的函数中没有定义ForwardIterator1 ,并且value_typetypedef ,而不是函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM