C++、std::copy 和模板
Posted
技术标签:
【中文标题】C++、std::copy 和模板【英文标题】:C++, std::copy and templates 【发布时间】:2011-05-23 19:41:12 【问题描述】:我正在使用模板和 STL 进行实验。这是我的测试代码...
template <typename Item>
struct TList
typedef std::vector <Item> Type;
;
template <typename Item>
class Cont
private:
typename TList <Item>::Type elements;
public:
void push_back ( const Item & p ) elements.push_back ( p );
typename TList <Item>::Type ::iterator
copy (typename TList <Item>::Type ::iterator first,
typename TList <Item>::Type ::iterator last,
typename TList <Item>::Type ::iterator result)
elements.resize(elements.size() + last - first); //Exception
return copy ( first, last, result );
typename TList <Item>::Type ::iterator begin() return elements.begin();
;
但是在复制操作期间
int main()
Cont <double> cont;
cont.push_back(1);
cont.push_back(2);
TList <double>::Type v;
v.push_back(3);
v.push_back(4);
cont.copy(v.begin(), v.end(), cont.begin()); //Exception
cont.copy(v.begin(), v.end(), cont.end()); //Exception
return 0;
程序导致运行时异常。你能帮我找出错误吗?
Exception: Vector iterator + offset out of range...
【问题讨论】:
-1:您是否尝试过在调试器中单步执行您的代码?或者添加跟踪语句来确定关键变量的值? 这是非常危险的代码。它有什么用? @Space: 只在我学习c++的时候考... @GMan:我几乎总是对遵循“这是我的代码。它不起作用。为什么不?”模式的问题投反对票。没有明显的调试尝试。 @Oli,我在发送之前调试了代码,但是我想不出带括号的技巧...... 【参考方案1】:表达式:
elements.size() + last - first
被评估为:
(elements.size() + last) - first
第一次添加的结果将是一个超出向量边界的迭代器,这会触发异常(在调试模式下)。你可以试试这个:
elements.size() + (last - first)
或者更类似于 STL 的方法:
elements.size() + std::distance(first, last)
【讨论】:
谢谢,但是还有一个问题:return copy(first,last,result)导致栈溢出。为什么? @Johnas:那行调用 yourcopy
方法,所以你最终得到了一个无限递归。您需要明确说明您想要的功能,即return std::copy(first, last, result)
。
再次感谢,您的建议对我很有帮助。【参考方案2】:
问题是由于您的copy
方法调整了向量的大小,从而使您传递给它的迭代器无效。
【讨论】:
我认为这不是问题所在。如果要相信 OP 的代码 sn-p,则异常发生在执行resize
的行上。
@Oli:我也刚刚意识到这一点。不过我会留下答案,因为如果新范围大于旧范围,就会发生这种情况。以上是关于C++、std::copy 和模板的主要内容,如果未能解决你的问题,请参考以下文章
使用 declype 推断模板元素类型中的数据类型是不是正确?