关于C++类模板的问题。。急

来源:百度知道 编辑:UC知道 时间:2024/05/21 20:52:30
我看了清华大学出版的《C++入门经典》里面有个例子,是说类模板的。。
我照原代码打出来以后,原代码如下:
template<typename T>T& array<T>::operator[](size_t index){
if(index<0||index>=size)
throw std::out_of_range(index<0?"Negative index":"Index too large");

return elements[index];
}
template<typename T>const T& array<T>::operator[](size_t index){
if(index<0||index>=size)
throw std::out_of_range(index<0?"Negative index":"Index too large");
}
再VC上运行出现错误提示是:“d:\c++project\temple.h(43) : error C2244: 'array<T>::[]' : unable to resolve function overload”我去查过相关资料后,知道这是因为类成员函数的申明与实现中该函数的参数表不一致。但是不是说再类模板中,用不到的函数是不会编译的么?为什么我明明再main函数中没申明const的变量,还出现错误提示?
请高手帮忙解决。。
问题是解决了,但是我想知道在函数标签前加const和在函数标签后加const有什么区别?

重载错误,不能区别2个重载函数
template<typename T>const T& array<T>::operator[](size_t index) const//加上const就能区别了{
if(index<0||index>=size)
throw std::out_of_range(index<0?"Negative index":"Index too large");
}
//////////////////给你个例子
#include<iostream>
using namespace std;
class A
{
int x;
public:
A():x(4)
{

}
void fun(int b)
{
x=b;
cout << x<<endl;
}
void fun(int b)const
{
cout << x <<endl;
}
};

int main()
{

const A a;
a.fun(1);
A b;
b.fun(1);
return 0;
}
/////////
类的非静态成员函数,编译器默认的会在参数列表最左面加上个this指针作为参数,在方法后面加const就是修饰this指针所指向的对象的,当然就this指针就指向对象自己,所以非静态成员方法后面加const的方法就不能改变类中成员变量的值了,
同时和非const方法相比,参数类型不同,所以也就满足重载条件了

第二个后面加上 const即可。因为不允许对参数表相同而返回值不同的情况作重载。加上const后,const修饰this,参数不同。在前面加,修饰的是返回值;在后面加,修饰