开发者社区> 问答> 正文

一个C++的小白问题,const&和&的形参?报错

template<typename T>
class List{
public:
List();
List(List<T> &L,int lo,int hi);//拷贝构造函数
~List();//析构函数
//对外接口
int Size();
bool IsEmpty();
T& operator[](int r)const;//对[]的重载
TYLIST(T) First();//返回首节点
TYLIST(T) Last();//返回最后一个节点
bool IsDisordered();//是否有序
//插入
void Assign(T const p,int n);//把p中的n个元素复制到list中
TYLIST(T) Insertpre(TYLIST(T) p, T const&el);//在p 节点之前插入元素
TYLIST(T) Insertaft(TYLIST(T) p, T const&el);//在p节点之后插入元素el
//查找
TYLIST(T) Find(T const&el);//查找某个元素    -- 无序
TYLIST(T) Find(T const&el, int lo, int hi);//某个区间查找   --无序
TYLIST(T) Search(T const&el);//有序情况下查找el,并返回一个合适的位置能够插入el
//删除
bool Remove(TYLIST(T) p);//删除某个节点,成功返回true
//排序
void Sort();
//去重
int Deduplicate();//无序
int Uniquify();//有序
void Reverse();//倒序
//遍历
void Traverse(void(
)(T &el));//函数指针
template<typename TP>
void Traverse(TP &);//函数对象
private:
int size;
TYLIST(T) head, *tail;//内部变量加以下划线开始,私有不能被继承,只能类和类的友元函数使用
protected:
void _Init();//初始化,类,子类,友元
void _Clear();//清空所有节点

};

template<typename T>
TYLIST(T) List<T>::First()
{
return _head_->next;
}
template<typename T>
List<T>::List(List<T> &L, int lo, int hi)
{
//static List<T> LL = L;//此时定义的static 局部对象,在析构是会出问题,会析构两次
_size_ = L.Size();
_head_ = new ListNode<T>;
_tail_ = new ListNode<T>;
_head_->pre = NULL;
TYLIST(T) temhead = _head_;
TYLIST(T) temp = L.First();
int tem = _size_;
while (tem--&&temp!=NULL)
{
TYLIST(T) p = new ListNode<T>;
p->next = NULL;
p->info = temp->info;
p->pre = temhead;
temhead->next = p;
temhead = p;
temp = temp->next;
}
_tail_->next = NULL;
_tail_->pre = temhead;
temhead->next = _tail_;
}
上面是代码的一部分,问题是:在拷贝构造函数中如果我的形参是List<T> &这个时候没错,若果是List<T>const&的时候会报错:

Error 3 error C2662: 'ListNode<T> *List<T>::First(void)' : cannot convert 'this' pointer from 'const List<int>' to 'List<int> &' 
Error 2 error C2662: 'int List<int>::Size(void)' : cannot convert 'this' pointer from 'const List<int>' to 'List<int> &' 

但是如果是const&,我在程序中没有修改对象的成员和成员函数,const只作为右值应该是可以的啊或者是我的理解完全有问题?求教高手!!


展开
收起
爱吃鱼的程序员 2020-06-09 15:31:45 833 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    如果使用List<T>const&或constList<T>&,那么参数L只能调用const修饰的成员函数,不能调用非const修饰的成员函数,改成: intsize()const;   TYLIST(T)First()const; 就可以了

    List<T>const&你想表达的是 const  List<T>&吧, &默认应该是和类型放在一起表示引用吧

    引用来自“xpbob”的评论

    List<T>const&你想表达的是 const  List<T>&吧, &默认应该是和类型放在一起表示引用吧

    引用来自“汉宫飞溅”的评论

    如果使用List<T>const&或constList<T>&,那么参数L只能调用const修饰的成员函数,不能调用非const修饰的成员函数,改成: intsize()const;   TYLIST(T)First()const; 就可以了

    2020-06-09 15:32:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载