“实现类似字符串的类时,没有名为'const_reference'的类型”错误

时间:2014-01-30 14:15:42

标签: c++

我正在尝试实现一个与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<炭> >':|

5 个答案:

答案 0 :(得分:4)

听起来您的vec不符合容器要求,因此无法保证可以使用适用于容器的标准设施(例如back_inserter)。

要求在C ++ 11的表96中指定,尽管C ++ 98中的表65可能更适合您的古老编译器。其中一个要求是嵌套的const_reference类型。

答案 1 :(得分:3)

检查std::back_inserterstd::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/

相关问题