【发布时间】:2012-09-13 22:53:17
【问题描述】:
我有点尝试实现一种复制运算符。 目的是有两个类:一个浏览容器,一个用它做一些事情。 Browse 类还(出于某种原因)在输出容器上维护一个迭代器,另一个可以用它计算增量。
不幸的是,编译器似乎无法将 back_insert_iterator 转换为输出迭代器。为什么?
#include <iostream>
#include <iterator>
#include <vector>
typedef std::vector<int> Vec;
// An operator that copy an item onto another
template< class TIN, class TOUT >
class DoCopy
{
TOUT operator()( const typename TIN::iterator i_in, const typename TOUT::iterator i_out )
{
const typename TOUT::iterator i_incr = i_out;
(*i_incr) = (*i_in);
std::advance( i_incr, 1 );
return i_incr;
}
};
// The class that iterate over a container, calling an operator for each item
template< class TIN, class TOUT >
class Browse
{
public:
// We keep a reference to the operator that really do the job
DoCopy<TIN,TOUT> & _do;
Browse( DoCopy<TIN,TOUT> & op ) : _do(op) {}
// Iterate over an input container
TOUT operator()(
const typename TIN::iterator in_start,
const typename TIN::iterator in_end,
const typename TOUT::iterator out_start
)
{
TOUT i_out = out_start;
for( TIN i_in = in_start; i_in != in_end; ++i_in ) {
// it is not shown why here, but we DO want the operator to increment i_out
i_out = _do(i_in, i_out);
}
}
};
int main()
{
// in & out could be the same type or a different one
Vec in;
Vec out;
DoCopy<Vec,Vec> do_copy;
Browse<Vec,Vec> copy(do_copy);
std::back_insert_iterator< Vec > insert_back(out);
// Here, g++ cannot find the corresponding function :
copy( in.begin(), in.end(), insert_back );
}
g++ 编译失败,出现以下错误:
$ g++ test.cpp && ./a.out
test.cpp: In function ‘int main()’:
test.cpp:54:49: erreur: no match for call to ‘(Browse<std::vector<int>, std::vector<int> >) (std::vector<int>::iterator, std::vector<int>::iterator, std::back_insert_iterator<std::vector<int> >&)’
test.cpp:22:11: note: candidate is:
test.cpp:30:18: note: TOUT Browse<TIN, TOUT>::operator()(typename TIN::iterator, typename TIN::iterator, typename TOUT::iterator) [with TIN = std::vector<int>, TOUT = std::vector<int>, typename TIN::iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, typename TOUT::iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >]
test.cpp:30:18: note: no known conversion for argument 3 from ‘std::back_insert_iterator<std::vector<int> >’ to ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’
【问题讨论】:
-
std::copy有什么问题吗? -
我其实是在尝试实现别的东西,但是选择副本的例子,因为我认为它会更清楚地说明问题。
-
调用你的变量
copy是邪恶的。此外,您在整个代码中使用const很奇怪,很可能是您的问题的原因。 -
copy定义在std和<algorithm>中,此处不包含。我看不出在一个为了解释而伪造的简单示例中使用它是多么邪恶。你说的“奇怪”是什么意思?任何解决我的问题的提示将不胜感激:-) -
@nojhan:将函数的参数设置为
const T真是太奇怪了。这让我觉得你的意思是const T&或者是要传递 const 迭代器,但搞砸了。此外,您也将i_incr声明为const,这是错误的,因为您实际上是在修改它。 (另外,你正在写它,所以你也不会想到const_iterator)