【发布时间】:2016-08-23 06:36:41
【问题描述】:
我想写一个模板化函数
- 接受 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());
我写的另一个sn-p是
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>)’
请详细说明错误的含义及其发生原因。还建议如何实现预期目标。
如果您能为新手提供一些了解迭代器的资源,我将不胜感激。
【问题讨论】:
-
我不完全清楚为什么
Container或Allocator甚至是模板类型参数的一部分。不只是Iterator工作吗?您仍然可以通过std::iterator_traits破译它的值类型。 -
@WhozCraig Container 被使用,这样我就可以传递对通用容器的引用并使用 container.size() 来显示所有元素。但是迭代器更方便。
标签: c++ templates stl iterator