动态数组的运算符重载给出奇怪的错误

2024-02-03

当我使用它时,我收到有关“废弃限定符”的错误。下面发布了整个班级。

cout << d // where d is of type dynamic_array.

全局重载函数:

template <class T> std::ostream& operator<<(std::ostream& stream, dynamic_array<T> const& data) 
  { 
  data.print_array(stream);
  return stream; 
  }

Dynamic_array 的公共成员

void print_array(std::ostream &os = cout) 
  { 
  for (int i = 0; i < size; i++) os << array[i] << endl; 
  } 

全类动态数组:

/*
Needs a reszie function added
Merge sort is better for sequential, stable(equal elements not re-arranged, or
*/
#include "c_arclib.cpp"

using namespace std;

template <class T> class dynamic_array
  {
  private:
    T* array;
    T* scratch;
    void merge_recurse(int left, int right)
      {
      if(right == left + 1)
        {
        return;
        }
      else
        {
        int i = 0;
        int length = right - left;
        int midpoint_distance = length/2;
        int l = left, r = left + midpoint_distance;
        merge_recurse(left, left + midpoint_distance);
        merge_recurse(left + midpoint_distance, right);
        for(i = 0; i < length; i++)
          {
          if((l < (left + midpoint_distance)) && (r == right || array[l] > array[r]))
            {
            scratch[i] = array[l];
            l++;
            }
          else
            {
            scratch[i] = array[r];
            r++;
            }
          }
        for(i = left; i < right; i++)
          {
          array[i] = scratch[i - left];
          }
        }
      }
    void quick_recurse(int left, int right) 
      {  
      int l = left, r = right, tmp;
      int pivot = array[(left + right) / 2];
      while (l <= r)
        {
        while (array[l] < pivot)l++;
        while (array[r] > pivot)r--;
        if (l <= r) 
          {
          tmp = array[l];
          array[l] = array[r];
          array[r] = tmp;
          l++;
          r--;
          }
        }
      if (left < r)quick_recurse(left, r);
      if (l < right)quick_recurse(l, right);
      }  
  public:
    int size;
    dynamic_array(int sizein)
      {
      size=sizein;
      array = new T[size]();
      }
    void print_array(std::ostream &os = cout) 
      { 
      for (int i = 0; i < size; i++) os << array[i] << endl; 
      } 
    void print_array()
      {
      for (int i = 0; i < size; i++) cout << array[i] << endl;
      }
    int merge_sort()
      {
      scratch = new T[size]();
      if(scratch != NULL)
        {
        merge_recurse(0, size);
        return 1;
        }
      else
        {
        return 0;
        }
      }
    void quick_sort()
      {
      quick_recurse(0,size);
      }
    void rand_to_array()
      {
      srand(time(NULL));
      int* k;
      for (k = array; k != array + size; ++k)                                             
        { 
        *k=rand();                                      
        } 
      }
    void order_to_array()
      {
      int* k;
      int i = 0;
      for (k = array; k != array + size; ++k)                                             
        { 
        *k=i;
        ++i;        
        } 
      }
    void rorder_to_array()
      {
      int* k;
      int i = size;
      for (k = array; k != array + size; ++k)                                             
        { 
        *k=i;
        --i;        
        } 
      }
  };


template <class T> std::ostream& operator<<(std::ostream& stream, dynamic_array<T> const& data) 
  { 
  data.print_array(stream);
  return stream; 
  }

int main()
  {
  dynamic_array<int> d1(1000000);
  d1.order_to_array();
  clock_t time_start=clock();
  d1.merge_sort(); 
  clock_t time_end=clock();
  double result = (double)(time_end - time_start) / CLOCKS_PER_SEC; 
  cout << result;
  cout << d1;
  }

问题出在以下几行:

template <class T>
std::ostream& operator<<(std::ostream& stream, dynamic_array<T> const& data) 
                                                                ^^^^^^

and

void print_array(std::ostream &os = cout)  /* const */
                                              ^^^^^  missing

既然你路过data as const& to operator <<,你必须维持它的const资格。 IE。data不能调用任何非const成员class dynamic_array。您可以通过两种方式解决这个问题:

  1. pass data就这么简单dynamic_array<T>& to operator <<
  2. make print_array a const方法(取消上面的注释)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态数组的运算符重载给出奇怪的错误 的相关文章

随机推荐

  • 防止 dblclick 事件触发时触发 click 事件

    我正在处理 DOM 元素上的 click 和 dblclick 事件 每个执行不同的命令 但我发现当双击元素时 除了触发双击事件之外 还触发了两次单击事件 防止这种行为的最佳方法是什么 万一其他人偶然发现这个问题 就像我一样 寻找答案 我能
  • Angular 8 和 9 中提供和注入“Window”与 Window 之间有什么区别?

    我有两个使用这些版本的 Angular 项目 9 0 0 下一个 6 8 1 0 在版本 9 中我用它来提供和注入window目的 NgModule providers provide Window useValue window expo
  • 使用 Java 重命名文件

    我们可以重命名一个文件吗test txt to test1 txt If test1 txt存在会重命名吗 如何将其重命名为已经存在的 test1 txt 文件 以便将 test txt 的新内容添加到其中以供以后使用 复制自http ex
  • 从 ELF 目标文件转储 C 结构大小

    如何使用调试符号从 ELF 目标文件中提取所有 C 结构的大小 可以使用 print sizeof some struct 从 GDB 获取各个结构大小 但我需要的是获取所有结构的列表 我查看了 nm 和 objdump 但没有看到执行我正
  • MongoDB“无法找到 $geoNear 查询的索引”

    我只是想得到一个简单的near查询工作 这是我的文档的示例 point type Point coordinates 30 443902444762696 84 27326978424058 created on date 13980167
  • 在 R Markdown 模板中包含图像,无需为模板创建新目录

    我正在构建一个投影仪演示模板 我想在幻灯片的前面添加一个徽标 尽管这可以通过在演示文稿目录中包含图像来实现 但我不希望只为该图像的每个新演示文稿创建一个新目录 有没有一种方法可以从包内检索相对文件路径resources文件夹并让它引用 La
  • 为什么套接字可以 connect() 到它自己的临时端口?

    我可以可靠地获得 Winsock 套接字connect 如果我使用自动分配的临时端口 5000 65534 范围内的端口连接到本地主机 具体来说 Windows 似乎有一个系统范围的滚动端口号 这是它将尝试分配为客户端套接字的本地端口号的下
  • 使用 std::string 键提升共享内存中的无序映射

    是否可以在共享内存上使用 std string 或其他复杂结构键类型以及 boost 无序映射 如果是这样 我可以找到一些示例代码吗 我找到了一些在共享内存上使用无序映射的示例代码 但无法将键类型更改为复杂结构 谢谢 Yes 您可以在此处查
  • 如何向初学者描述面向对象编程?现实世界有一个很好的类比吗?

    我的姐夫是一名大学工程专业的新生 他之前没有编程经验 他正在课堂上学习编程 但他似乎在基本概念上遇到了困难 更糟糕的是 他似乎是所有班级中唯一没有编程背景的人 他在 Matlab 上做得很好 我不知道 然后当他学习 Python 基础知识时
  • Cytsocape.js 无法使用不存在的目标创建边缘

    在使用 AJAX 请求创建节点后 我尝试创建边缘 My code success function data each data kids function i value cy add group nodes data id value
  • 从 QML 访问 QStandardItemModel 的项目

    已编辑 在原始问题中 我错误地假设 GridView 本机使用二维模型 事实上 它与其他 QML 类似 需要一个元素列表 意见 为了使问题和答案更容易理解 我更改了给定的代码 轻微地 此外 我根据答案添加了工作解决方案 在主程序中 我定义了
  • Win32 LB_GETTEXT 返回垃圾

    我有一个问题 很可能是一个简单的问题 但对我来说仍然是一个问题 我在 Win32 C 中使用列表框 当从列表框中获取选定的文本时 返回的字符串只是垃圾 它是结构或类似结构的句柄 下面是代码和我得到的示例 std string Listbox
  • 在heroku上管理多个ssh密钥

    所以我有几个 ssh 密钥用于我拥有的其他帐户 我现在需要能够在我的计算机上克隆 heroku 存储库 我创建了一个新的 ssh 密钥并使用 heroku keys add 将其添加到我的 heroku 帐户 但是 当我尝试克隆存储库时 我
  • 无法在 Docker Compose 中向非 root 用户授予对 Docker 卷的写入权限

    我正在运行一个 Docker Compose 环境 在其中执行一系列 Selenium 测试 为了做到这一点 我正在使用Selenium 提供的图像 https github com SeleniumHQ docker selenium 我
  • 函数导致自动生成的 RcppExports.R 检查错误

    我正在使用 Rcpp 0 12 11 和 R 3 4 0 当我将 Rcpp 升级到 0 12 11 时 由 Rcpp compileAttributes 自动生成的 R 文件 RcppExports R 开始为我提供略有不同的函数调用 ru
  • VS2013中cshtml窗口垂直分割

    在VS2013中我想查看相同的cshtml文件并排在 2 个窗口中 即垂直分割 我知道如何进行水平分割 但这不是我在这里追求的 通常的方法是复制选项卡 WINDOW New Window 文件 然后创建一个新的垂直选项卡组 但是 我找不到复
  • Android应用程序强制关闭时如何在运行时获取日志

    如何在 Android 应用程序中强制关闭时在运行时获取日志 我想获取日志并邮寄 这里有一些用于收集应用程序内部日志的代码 private int MAX LOG MESSAGE LENGTH 100000 private String m
  • 将 Vuetify 导航抽屉切换为迷你,然后切换为临时

    我在 Vue js 中有一个项目 我正在使用 Vuetify 我有一个工具栏和导航抽屉 我想要的是在桌面上抽屉打开时 如果用户单击侧面图标 抽屉将切换为迷你 如果打开 md 抽屉将切换至迷你 如果用户单击侧面图标 迷你会切换回抽屉 如果打开
  • 如果 NSString 不等于函数?

    我已经到处搜索过这个问题 包括苹果关于 NSString 的文档 也许我没有看到 但我试图在 xCode 中找到一种方法来检查 NSString 是否不等于某些内容 很像 if myNSSting text 除了特别我想检查它是否不等于 文
  • 动态数组的运算符重载给出奇怪的错误

    当我使用它时 我收到有关 废弃限定符 的错误 下面发布了整个班级 cout lt lt d where d is of type dynamic array 全局重载函数 template