Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当泛化STL容器的迭代器的值类型未知时,如何使用模板迭代器?_C++_Templates_Stl_Iterator - Fatal编程技术网

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
之外使用
第一个,但我不确定第二个:衰变有什么用?@rainer
decltype(*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
有什么用?@rainer
decltype(*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;
}