我正在尝试实现一个与std :: string具有类似行为的类,并且我在std :: copy行中收到错误:
Str& operator+=(const Str& s){
std::copy(s.data.begin(), s.data.end(), std::back_inserter(data));
return *this;
}
'data'是vec<类型的对象。炭> ,vec是一个类似矢量的类,我自己实现,它似乎自己很好。
它也说:
C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.2 ........ \ include \ c ++ \ 3.4.2 \ bits \ stl_iterator.h ||实例化`std :: back_insert_iterator< VEC<炭> >':|
答案 0 :(得分:4)
听起来您的vec
不符合容器要求,因此无法保证可以使用适用于容器的标准设施(例如back_inserter
)。
要求在C ++ 11的表96中指定,尽管C ++ 98中的表65可能更适合您的古老编译器。其中一个要求是嵌套的const_reference
类型。
答案 1 :(得分:3)
检查std::back_inserter
和std::copy
的要求。特别是,std::back_inserter
期望一个满足 Container 概念的参数。至少这意味着实施标准的§23.2.1,其中列出的要求之一是:
X::const_reference
|T
|的常量值编译时间
即。容器类型中的typedef const_reference
。
答案 2 :(得分:2)
back_inserter
是一个方便的功能,可以在容器上构建back_insert_iterator
;在这种情况下,data
。
data
是你自己开发的vector
类型的类。为了使其正常工作,您的vector
类必须定义const_reference
typedef。像这样:
template <typename Item>
class Vec
{
public:
typedef const Item& const_reference;
};
对容器的任何实现都有许多其他要求。这些内容在C ++ 03标准的 23.1容器要求部分(包括表65)中进行了概述。
有关要求的讨论,另请参阅this question。
答案 3 :(得分:1)
尝试添加
typedef T value_type;
typedef const value_type&amp;为const_reference;
在你的vec&lt; T&gt;体。
答案 4 :(得分:0)
问题需要更多细节,比如你的vec课程。
你得到的错误究竟是什么?请分享有关错误的更多信息。控制台日志会有所帮助。
std :: copy接受两个输入迭代器。(http://www.cplusplus.com/reference/algorithm/copy/) 你确定像类这样的向量是否正确处理迭代器?
另外,请检查您的vec是否支持back_inserter所需的容器要求。 http://www.cplusplus.com/reference/iterator/back_inserter/