救命!vector出错了!

时间:2022-01-13 15:03:30
这个程序有5000行的规模。
剩下这最后一个语法错误无法解决,大家帮忙想一下,这里截取跟错误有关的内容。
Player.h中头文件的包含。

#include "Poker.h"
#include "PokerUIList.h"
//#include "Referee.h" 想在类中创建Referee的指针对象,不用这样包含。这样包含,导致Referee类在CPlayer类前编译,从而使CPlayer对象在CReferee中不被识别
#include  <vector> 
using   namespace   std;



CPlayer类中Single的定义private:
class Single 
{
public:
CPokerUIList sList;//
int score;//本个体的得分
Single()
{
//个体初始化
score=0;

}
Single(Single &A)
{
score=A.score;
A.sList.CreateNewList(1,A.sList.GetCount(),sList);
}
};//一个个体
single是一个嵌套在CPlayer中的一个类,(当然好像起名CSingle更好些)因为CPlayer中有很多函数要用这个类。。。。
编译提示,错误是这样的。(当然,Single是被装入了vector中来使用的)

错误定位在vector文件中。
 
#if _HAS_ITERATOR_DEBUGGING
if (_Where._Mycont != this
|| _Where._Myptr < _Myfirst || _Mylast < _Where._Myptr)
_DEBUG_ERROR("vector insert iterator outside range");
 #endif /* _HAS_ITERATOR_DEBUGGING */

_Ty _Tmp = _Val; // in case _Val is in sequence     //就是这一行错误
size_type _Capacity = capacity();
错误提示如下。
1>c:\program files\microsoft visual studio 8\vc\include\vector(1125) : error C2558: class 'CPlayer::Single' : no copy constructor available or copy constructor is declared 'explicit'
1>        c:\program files\microsoft visual studio 8\vc\include\vector(1117) : while compiling class template member function 'void std::vector<_Ty>::_Insert_n(std::_Vector_iterator<_Ty,_Alloc>,__w64 unsigned int,const _Ty &)'
1>        with
1>        [
1>            _Ty=CPlayer::Single,
1>            _Alloc=std::allocator<CPlayer::Single>
1>        ]
1>        d:\源程序\shuangsheng\shuangsheng\player.cpp(545) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>        with
1>        [
1>            _Ty=CPlayer::Single
1>        ]





本人能力有限,已是黔驴技穷,恭听大师教诲!

22 个解决方案

#1


请试验以下代码,再将惟一一处的const删去,看看编译提示是什么。
class A
{
public:
A(){}
A( const A& ){}
};

int main()
{
vector< A > vec;
A a;
vec.push_back( a );
return 0;
}

复制构造函数的参数是 const的。

#2


vector在哪声明的?贴出来看看啊。

看看这两种可能

1. Single改为public的试试。
2. vector定义成这样:vector<CPlayer::Single>

#3


‘no copy constructor available or copy constructor is declared 'explicit'’
Single(Single &A) ??

#4


引用 2 楼  的回复:
vector在哪声明的?贴出来看看啊。

看看这两种可能

1. Single改为public的试试。
2. vector定义成这样:vector<CPlayer::Single>

贴一下vector吧

#5


应该是类需要一个拷贝构造函数
类似CString(_In_ const CString& strSrc);

#6


楼上的大侠,vector是库文件吧!也需要贴吗?

#7


缺少拷贝构造函数要么使用类的指针

#8


你可能需要这样定义拷贝构造函数:
Single(const Single &A)

这样一来,可能会带来其它问题,比如A.sList.GetCount()这句可能又要出错,此时又要修改sList.GetCount()的签名为(如果你不是这样签名的话):
(你原来的返回类型) GetCount() const

这可能带来一系列连锁反应。但只是时间问题,没什么难度。

#9


引用 6 楼  的回复:
楼上的大侠,vector是库文件吧!也需要贴吗?

是你声明vector的地方
救命!vector出错了!

#10


你上面贴的那个看不出来,代码信息不够~

#11



        Single(Single &A)
        {
            score=A.score;
            A.sList.CreateNewList(1,A.sList.GetCount(),sList);
        }

猜想应改为

        Single(const Single &A)
        {
            score=A.score;
            A.sList.CreateNewList(1,A.sList.GetCount(),sList);
        }

#12


信息不够,你Vector又存指针了?然后指的那玩样生命周期太短?

猜测。

#13


引用 1 楼  的回复:
请试验以下代码,再将惟一一处的const删去,看看编译提示是什么。

C/C++ code
class A
{
public:
    A(){}
    A( const A&amp; ){}
};

int main()
{
    vector< A > vec;
    A a;
    vec.push_back( a );
    return 0;
}……

===========================================================
wo 实验过你的例子了,const存在与否均可以顺利编译通过,我是vs2005环境

#14


该回复于2012-09-03 16:35:06被版主删除

#15


引用 8 楼  的回复:
你可能需要这样定义拷贝构造函数:
Single(const Single &amp;A)

这样一来,可能会带来其它问题,比如A.sList.GetCount()这句可能又要出错,此时又要修改sList.GetCount()的签名为(如果你不是这样签名的话):
(你原来的返回类型) GetCount() const

这可能带来一系列连锁反应。但只是时间问题,没什么难度。

======================================================================
8楼老兄说的是,加上const,就引进了更多的错误。程序总体接近1w行代码,因为刚开始类设计的不科学,const用的有点乱。光一个const就把人弄的焦头烂额。
最简单的办法就是去掉所有的const,这样程序便可以减少很多出错的机会。现在就剩下这最后一个错误了。错误如果指向别的地方还好说,结果指向vector库文件,这真是麻烦呀!

#16


该回复于2012-09-04 08:33:05被版主删除

#17


引用 13 楼  的回复:
我实验过你的例子了,const存在与否均可以顺利编译通过,我是vs2005环境

我用VC6和VC2008都试过了,去掉const不能编译通过。没有2005
我还专门用gcc试了一下,去掉const不能编译通过。

必须要加上啊。

#18


楼上的,我也查了钱能的c++书籍,他在书中介绍拷贝构造函数的时候,所有的例子,都未加const。
从理论上来说,加了const应该只是说这个引用不能改变,并没有别的意思吧~

#19


从你提供的信息看,估计是Single插入vector时,复制构造函数由于Single类是私有类而导致无法访问。可以尝试将private改成public

#20


Single(Single const &A)

#21


引用 19 楼  的回复:
从你提供的信息看,估计是Single插入vector时,复制构造函数由于Single类是私有类而导致无法访问。可以尝试将private改成public

这样修改问题依旧


实验了8楼仁兄的办法,这个错误消失了,不过又引入了几个其他的错误,正在按照8楼的方法整改中

#22


灰常灰常高兴,问题已经解决,先进行以下总结:

首先问题是按照8楼提供的思路解决的。。。。。。
这里拷贝构造函数还是要用const,这点还没搞明白,因为拷贝构造函数不一定非要用const参数吧!!!

因为代码多,类与类之间有千丝万缕的联系(这归功于类的设计有缺陷),这点还得再研究下。

不过这次让我领教了不规范用const的后果,一个const类对象,只能调用const函数,而我的代码中好多属于对象为const,而调用的好多函数却不是const,因为涉及的函数多,最终修改起来很费劲。。。

再次感谢大家

#1


请试验以下代码,再将惟一一处的const删去,看看编译提示是什么。
class A
{
public:
A(){}
A( const A& ){}
};

int main()
{
vector< A > vec;
A a;
vec.push_back( a );
return 0;
}

复制构造函数的参数是 const的。

#2


vector在哪声明的?贴出来看看啊。

看看这两种可能

1. Single改为public的试试。
2. vector定义成这样:vector<CPlayer::Single>

#3


‘no copy constructor available or copy constructor is declared 'explicit'’
Single(Single &A) ??

#4


引用 2 楼  的回复:
vector在哪声明的?贴出来看看啊。

看看这两种可能

1. Single改为public的试试。
2. vector定义成这样:vector<CPlayer::Single>

贴一下vector吧

#5


应该是类需要一个拷贝构造函数
类似CString(_In_ const CString& strSrc);

#6


楼上的大侠,vector是库文件吧!也需要贴吗?

#7


缺少拷贝构造函数要么使用类的指针

#8


你可能需要这样定义拷贝构造函数:
Single(const Single &A)

这样一来,可能会带来其它问题,比如A.sList.GetCount()这句可能又要出错,此时又要修改sList.GetCount()的签名为(如果你不是这样签名的话):
(你原来的返回类型) GetCount() const

这可能带来一系列连锁反应。但只是时间问题,没什么难度。

#9


引用 6 楼  的回复:
楼上的大侠,vector是库文件吧!也需要贴吗?

是你声明vector的地方
救命!vector出错了!

#10


你上面贴的那个看不出来,代码信息不够~

#11



        Single(Single &A)
        {
            score=A.score;
            A.sList.CreateNewList(1,A.sList.GetCount(),sList);
        }

猜想应改为

        Single(const Single &A)
        {
            score=A.score;
            A.sList.CreateNewList(1,A.sList.GetCount(),sList);
        }

#12


信息不够,你Vector又存指针了?然后指的那玩样生命周期太短?

猜测。

#13


引用 1 楼  的回复:
请试验以下代码,再将惟一一处的const删去,看看编译提示是什么。

C/C++ code
class A
{
public:
    A(){}
    A( const A&amp; ){}
};

int main()
{
    vector< A > vec;
    A a;
    vec.push_back( a );
    return 0;
}……

===========================================================
wo 实验过你的例子了,const存在与否均可以顺利编译通过,我是vs2005环境

#14


该回复于2012-09-03 16:35:06被版主删除

#15


引用 8 楼  的回复:
你可能需要这样定义拷贝构造函数:
Single(const Single &amp;A)

这样一来,可能会带来其它问题,比如A.sList.GetCount()这句可能又要出错,此时又要修改sList.GetCount()的签名为(如果你不是这样签名的话):
(你原来的返回类型) GetCount() const

这可能带来一系列连锁反应。但只是时间问题,没什么难度。

======================================================================
8楼老兄说的是,加上const,就引进了更多的错误。程序总体接近1w行代码,因为刚开始类设计的不科学,const用的有点乱。光一个const就把人弄的焦头烂额。
最简单的办法就是去掉所有的const,这样程序便可以减少很多出错的机会。现在就剩下这最后一个错误了。错误如果指向别的地方还好说,结果指向vector库文件,这真是麻烦呀!

#16


该回复于2012-09-04 08:33:05被版主删除

#17


引用 13 楼  的回复:
我实验过你的例子了,const存在与否均可以顺利编译通过,我是vs2005环境

我用VC6和VC2008都试过了,去掉const不能编译通过。没有2005
我还专门用gcc试了一下,去掉const不能编译通过。

必须要加上啊。

#18


楼上的,我也查了钱能的c++书籍,他在书中介绍拷贝构造函数的时候,所有的例子,都未加const。
从理论上来说,加了const应该只是说这个引用不能改变,并没有别的意思吧~

#19


从你提供的信息看,估计是Single插入vector时,复制构造函数由于Single类是私有类而导致无法访问。可以尝试将private改成public

#20


Single(Single const &A)

#21


引用 19 楼  的回复:
从你提供的信息看,估计是Single插入vector时,复制构造函数由于Single类是私有类而导致无法访问。可以尝试将private改成public

这样修改问题依旧


实验了8楼仁兄的办法,这个错误消失了,不过又引入了几个其他的错误,正在按照8楼的方法整改中

#22


灰常灰常高兴,问题已经解决,先进行以下总结:

首先问题是按照8楼提供的思路解决的。。。。。。
这里拷贝构造函数还是要用const,这点还没搞明白,因为拷贝构造函数不一定非要用const参数吧!!!

因为代码多,类与类之间有千丝万缕的联系(这归功于类的设计有缺陷),这点还得再研究下。

不过这次让我领教了不规范用const的后果,一个const类对象,只能调用const函数,而我的代码中好多属于对象为const,而调用的好多函数却不是const,因为涉及的函数多,最终修改起来很费劲。。。

再次感谢大家