Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能纠正我的重载函数的错误吗?_C++_Templates_Overloading - Fatal编程技术网

C++ 有人能纠正我的重载函数的错误吗?

C++ 有人能纠正我的重载函数的错误吗?,c++,templates,overloading,C++,Templates,Overloading,我不太熟悉模板和重载的使用,有人要求我作为练习修改代码。我纠正了所有我能确定的,但我不确定我忽略了什么。如果变量名听起来不好,我很抱歉,它们都是原始的坏代码 错误消息的一部分是 CSL.cpp:在成员函数“void CSL::showList()[with T=int]”中: CSL.cpp:106:从此处实例化CSL.cpp:26:错误:订阅 值既不是数组也不是指针 守则本身: template<class T> CSL<T>::CSL(T *d, int s) : d

我不太熟悉模板和重载的使用,有人要求我作为练习修改代码。我纠正了所有我能确定的,但我不确定我忽略了什么。如果变量名听起来不好,我很抱歉,它们都是原始的坏代码

错误消息的一部分是

CSL.cpp:在成员函数“void CSL::showList()[with T=int]”中:

CSL.cpp:106:从此处实例化CSL.cpp:26:错误:订阅 值既不是数组也不是指针

守则本身:

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;
}
模板
CSL::CSL(T*d,int-s):数据(*d),大小(s)
{
}
模板
void CSL::showList()//函数有问题。
{

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

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

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

cout << data[x];
这显然是毫无意义的。您可能打算将
T*
作为
数据的类型,并将构造函数重写为:

template<class T>
CSL<T>::CSL(T *d, int s) : data(d), size(s)
//                         ^^^^^^^
//                         Just pass d instead of *d
{
}
模板
CSL::CSL(T*d,int-s):数据(d),大小(s)
//                         ^^^^^^^
//只需通过d而不是*d
{
}
但是,请注意,将封装容器的所有权留给客户机是一个笨拙的设计决策。这样,您必须确保
CSL
对象不会比数组寿命长(否则,
数据
将是一个悬空指针)


因此,您的
CLS
类应该包含作为构造函数输入提供的数组的副本。为了避免在动态分配、删除数组、三法则、五法则等方面出错,您应该为此使用RAII包装器。

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

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

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

cout << data[x];
这显然是毫无意义的。您可能打算将
T*
作为
数据的类型,并将构造函数重写为:

template<class T>
CSL<T>::CSL(T *d, int s) : data(d), size(s)
//                         ^^^^^^^
//                         Just pass d instead of *d
{
}
模板
CSL::CSL(T*d,int-s):数据(d),大小(s)
//                         ^^^^^^^
//只需通过d而不是*d
{
}
但是,请注意,将封装容器的所有权留给客户机是一个笨拙的设计决策。这样,您必须确保
CSL
对象不会比数组寿命长(否则,
数据
将是一个悬空指针)


因此,您的
CLS
类应该包含作为构造函数输入提供的数组的副本。为了避免在动态分配、删除数组、三分规则、五分规则等方面出错,您应该为此使用RAII包装器。

如果您去掉红色不重要的代码可能不需要展示有问题的行为。-1用于张贴代码墙,而不是简化为问题的简单说明。如果你不这样做,这意味着我们要做更多的工作。如果你这样做,我们的工作更少,而你的工作更多。因为这是你的问题,你需要承担大部分的工作。哎哟,我会立即修剪代码。@DavidHeffernan我真的很感激你让我知道,而不是让其他人记下而不纠正我的错误。再次感谢你删除投票,感谢你这么好地采纳了建议。如果你去除了多余的代码,而这些代码不是展示问题行为所必需的,也许。-1用于发布wall代码,而不是简化为问题的简单说明。如果你不这样做,这意味着我们要做更多的工作。如果你这样做,我们的工作会更少,而你的工作会更多。因为这是你的问题,你需要承担大部分的努力。哎哟。我会立即修改代码。@DavidHeffernan我真的很感激你让我知道,而不是让我知道其他人只是记下了我的错误,却没有纠正我的错误。再次感谢你。再次感谢你,感谢你这么好地采纳了建议。感谢你的精彩解释。100%理解我现在做错了什么!再次感谢你!再次感谢你的精彩解释。100%理解我现在做错了什么!再次感谢你!