c++ - 有人可以纠正我的重载功能做错了什么吗?

标签 c++ templates overloading

我对模板和重载的使用不是很熟悉,让我改了一段代码作为练习题。我纠正了所有我能设法识别的内容,但我不确定我忽略了什么。如果您觉得变量名称不好,我深表歉意,它们都带有原始损坏的代码。

部分错误信息是

CSL.cpp: In member function 'void CSL::showList() [with T = int]':

CSL.cpp:106: instantiated from here CSL.cpp:26: error: subscripted value is neither array nor pointer

代码本身:

template<class T>
CSL<T>::CSL(T *d, int s) : data(*d), size(s)
{
}

template<class T>
void CSL<T>::showList()                 //Function with problem.
{
  cout<<"Comma separated list:"<<endl;
  for(int x = 0; x < size; ++x)
  {
    cout << data[x];
    if(x != size + 1)
      cout << ": ";
  }
  cout << endl << endl;
}

int main()
{

  someCustomers[0].setCustomer("Zaps", 23.55);
  //...
  someCustomers[5].setCustomer("Curtin",56999.19);

  CSL_Size = sizeof(someInts)/sizeof(someInts[0]);
  CSL<int> CSL_Integers(someInts, CSL_Size);
  //...    
  CSL_Size = sizeof(someCustomers)/sizeof(someCustomers[0]);
  CSL<Customer> CSL_Customers(someCustomers, CSL_Size);

  CSL_Integers.showList();   //Problem starts here
  CSL_Doubles.showList();
  CSL_Videos.showList();
  CSL_Customers.showList();

  return 0;
}

最佳答案

您的 CLS 类模板接受类型参数 T 并定义该类型的数据成员 data

当您提供 int 作为 T 的类型参数时,内部数据成员 data 的类型因此是 整数

在您的 showList() 函数中,您尝试将下标运算符应用于该 int,将另一个整数值作为输入传递给 operator [ ]:

cout << data[x];

但这是非法的,因为不涉及指针运算(data 不是数组,也不是指针,x 也不是)。这基本上相当于按照这些思路做一些事情:

42[1729]

这显然是无稽之谈。您可能打算将 T* 作为 data 的类型,并将您的构造函数重写为:

template<class T>
CSL<T>::CSL(T *d, int s) : data(d), size(s)
//                         ^^^^^^^
//                         Just pass d instead of *d
{
}

但是请注意,将封装容器的所有权留给客户是一个尴尬的设计决定。这样,您将必须确保 CSL 对象的生命周期不会超过数组(否则,data 将成为悬空指针)。

出于这个原因,您的 CLS 类应该包含作为构造函数输入提供的数组的拷贝。为了避免在动态分配、删除数组、三规则、五规则等方面犯错误,您应该使用 RAII 包装器,例如 std::vector。为此目的。

关于c++ - 有人可以纠正我的重载功能做错了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16607610/

相关文章:

c++ - 从其(部分)特化调用类模板的静态函数

python - 如何重载 `__eq__` 来比较 pandas DataFrames 和 Series?

c++ - 模板重载加上指向指针的指针

c++ - 定义需要在运行时设置的 const static

c++ - 如何更改变量的地址?

c++ - 如何在 Ubuntu 12.04 中为 Qt Creator 安装和设置 OpenCV 2.6.1

c++ - 为什么大小不是 std::initializer_list 的模板参数?

c++ - 如何在 C++ 中根据函数模板类型应用不同的#define?

c++ - 队列类 C++ 的输出运算符重载

c++ - c++模板语法解释