【问题标题】:"no type named 'const_reference' " error when implementing a string-like class实现类似字符串的类时出现“没有名为‘const_reference’的类型”错误
【发布时间】:2014-02-22 21:30:14
【问题描述】:

我正在尝试实现一个与 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<char>const_reference 类型吗?
  • 我添加了一个'typedef const T& const_reference'并编译,现在让我们看看它是否有效。谢谢大家的回答,希望我能投票给大家。
  • 如果答案有帮助,您应该接受其中一个答案。
  • “加速 C++”第 12 章,作者 A. Koenig 和 B. E. Moo。你能引用他们吗?

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    检查std::back_inserterstd::copy 的要求。特别是,std::back_inserter 需要一个满足概念 Container 的参数。至少这意味着执行该标准的 §23.2.1,其中列出的要求之一是:

    X::const_reference | T 的 const 左值 |编译时间

    即容器类型内的typedef const_reference

    【讨论】:

      【解决方案3】:

      back_inserter 是一个便利函数,它在容器上构造一个back_insert_iterator;在这种情况下,data

      data,你说过,是你自己的 vector-type 类。为了使其工作,您的vector 类必须定义const_reference typedef。像这样的:

      template <typename Item>
      class Vec
      {
      public:
        typedef const Item& const_reference;
      };
      

      对于容器的任何实现,还有许多其他要求。这些在 C++03 标准的 23.1 容器要求 部分(包括表 65)中进行了概述。

      有关要求的讨论,另请参阅 this question

      【讨论】:

        【解决方案4】:

        尝试添加

        typedef T value_type;
        typedef const value_type& const_reference;

        在你的 vec 体内。

        【讨论】:

          【解决方案5】:

          问题需要更多详细信息,例如您的 vec 类。

          您遇到的具体错误是什么?请分享有关该错误的更多信息。控制台日志会很有帮助。

          std::copy 接受两个输入迭代器。(http://www.cplusplus.com/reference/algorithm/copy/) 你确定你的向量类正确处理迭代器吗?

          另外请检查您的 vec 是否支持 back_inserter 所需的容器要求。 http://www.cplusplus.com/reference/iterator/back_inserter/

          【讨论】:

          • -1:这里有几个问题。首先,提供了足够的细节,至少可以对问题进行非常接近的猜测。查看其他答案。其次,这个“答案”实际上只是OP的一堆问题,要求澄清。因此,这应该作为 comment 而不是 answer 发布。
          • 我没有足够的积分来发表评论。
          猜你喜欢
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 2020-09-12
          • 2019-12-03
          • 1970-01-01
          • 1970-01-01
          • 2018-07-20
          • 2015-10-27
          相关资源
          最近更新 更多