C++ 当泛化STL容器的迭代器的值类型未知时,如何使用模板迭代器?
我想写一个模板函数C++ 当泛化STL容器的迭代器的值类型未知时,如何使用模板迭代器?,c++,templates,stl,iterator,C++,Templates,Stl,Iterator,我想写一个模板函数 接受2个迭代器 使用*copy(在算法标准标题中定义)打印存储在容器中的内容 下面是我编写的一段代码,但产生编译错误 template <template<typename, typename> class Container, typename Value, typename Allocator = std::allocator<Value> > void printContaine
- 接受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;
}
模板
void printContainer(容器::迭代器itBegin,
容器::迭代器(itEnd)
{
复制(itBegin、itEnd、ostream_迭代器(cout,“”));
cout(cout,“”);
//试验2
复制(itBegin、itEnd、ostream_迭代器(cout,“”));
cout(cout,“”);
^
错误2:模板参数1无效
复制(itBegin、itEnd、ostream_迭代器<迭代器特征::值类型>(cout,“”);
^
错误3:模板参数1无效
复制(itBegin、itEnd、ostream_迭代器<迭代器特征::值类型>(cout,“”);
^
错误3:“模板类std::ostream\u迭代器”的模板参数列表中参数1的类型/值不匹配
复制(itBegin、itEnd、ostream_迭代器(cout,“”));
^
错误4:应为类型,已获取“(值\类型(itBegin)*)”
请详细说明错误的含义及其发生原因。并建议如何实现预期目标
如果您能为初学者提供一些了解迭代器的来源,我将不胜感激。关于您的第一个问题,您可以简单地使用迭代器作为模板类型,并使用
迭代器::value\u 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;
}
从C++14开始,还可以使用decltype
和decay\t
:
template <typename Iterator>
void printContainer(Iterator itBegin,
Iterator itEnd)
{
copy(itBegin, itEnd, ostream_iterator<decay_t<decltype(*itBegin)>>(cout, " "));
cout << endl;
}
模板
void printContainer(迭代器itBegin,
迭代器(itEnd)
{
复制(itBegin、itEnd、ostream_迭代器(cout,“”));
cout关于第一个问题,您可以简单地使用迭代器作为模板类型,并使用迭代器::value\u 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;
}
从C++14开始,还可以使用decltype
和decay\t
:
template <typename Iterator>
void printContainer(Iterator itBegin,
Iterator itEnd)
{
copy(itBegin, itEnd, ostream_iterator<decay_t<decltype(*itBegin)>>(cout, " "));
cout << endl;
}
模板
void printContainer(迭代器itBegin,
迭代器(itEnd)
{
复制(itBegin、itEnd、ostream_迭代器(cout,“”));
难道我不完全清楚为什么容器
或分配器
甚至是模板类型参数的一部分。难道不仅仅是迭代器
就可以工作吗?你仍然可以通过std::Iterator\u traits
@WhozCraig容器来破译它的值类型,这样我就可以传递一个对通用容器的引用并使用container.size()显示所有元素。但是迭代器更方便。我不完全清楚为什么容器
或分配器
甚至是模板类型参数的一部分。仅仅是迭代器
会起作用吗?你仍然可以通过std::Iterator\u traits
@WhozCraig容器来破译它的值类型至少,我可以传递一个对通用容器的引用,并使用container.size()显示所有元素。但是迭代器更方便。iterator\u traits
比iterator::value\u type
更好,因为前者使用常规指针。decltype
可以在decltype
之外使用第一个,但我不确定第二个:衰变有什么用?@rainerdecltype(*itBegin)
将返回(const
-qualified)对value\u type
的引用,或者(const)value\u type&
,如果您只想value\u type
,则需要删除引用和(可能的)const
-限定条件,这就是它的作用。@rainer感谢你和所有帮助我解决这个问题的人。现在我可以把更多的精力放在这个问题上,而不仅仅是打印容器:)iterator\u traits
比iterator::value\u type
更好,因为前者使用常规指针。decay\u t
可能用于ad除了decltype
之外,还有等效的代码。@Jarod42:谢谢你指出了这些事情。我已经更新了第一个,但我不确定第二个:decltype
有什么用?@rainerdecltype(*itBegin)
将返回(const
-qualified)对value\u-type
的引用,或者(const)value\u type&
-如果您只想要value\u type
,您需要删除引用和(可能的)const
-限定,这就是原因所在。@rainer感谢您和所有帮助我解决此问题的其他人。现在,我可以将重点放在问题上,而不仅仅是打印容器:)
template <typename Iterator>
void printContainer(Iterator itBegin,
Iterator itEnd)
{
copy(itBegin, itEnd, ostream_iterator<typename iterator_traits<Iterator>::value_type>(cout, " "));
cout << endl;
}
template <typename Iterator>
void printContainer(Iterator itBegin,
Iterator itEnd)
{
copy(itBegin, itEnd, ostream_iterator<decay_t<decltype(*itBegin)>>(cout, " "));
cout << endl;
}