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