'operator =' function is unavailable (HELP!!来者有分!!)

selfwill 2004-04-27 10:30:29
请问下面的程序为什么会引起VC编译器C2582的错误,
说找不到拷贝构造函数,请问该如何解决?不尽感激!


#ifdef _MSC_VER
#pragma warning(disable:4786)
#endif

#include <iostream>
#include <algorithm>
#include <functional>
#include <string>
#include <map>

using namespace std;

struct CDir
{
int ID;
string Name;
int ParentID;

/* CDir() {}
CDir(const CDir & Dir) {
ID = Dir.ID;
Name = Dir.Name;
ParentID = Dir.ParentID;
}
CDir & operator =(const CDir & Dir) {
ID = Dir.ID;
Name = Dir.Name;
ParentID = Dir.ParentID;
return *this;
}*/ // 加上这段代码也没用:(
};

bool IDEqualsN(pair<int, CDir> elem, int n)
{
return elem.second.ID == n;
}

int main()
{
int i;
map<int, CDir> CDirs;
for (i = 0; i < 10; i++)
{
CDir CDir;
CDir.ID = i;
CDir.Name = "hello";
CDir.ParentID = 0;
CDirs[i] = CDir;
}
CDirs.erase(
remove_if(CDirs.begin(), CDirs.end(), bind2nd(ptr_fun(IDEqualsN), 3)),
CDirs.end());

return 0;
}

...全文
1057 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
selfwill 2004-05-02
  • 打赏
  • 举报
回复
哦,忘了原来可以这样!

谢谢各位帮忙!大家加油!^_^
selfwill 2004-04-29
  • 打赏
  • 举报
回复
Areece(Keen on Guru)在吗?
selfwill 2004-04-29
  • 打赏
  • 举报
回复
to Areece(Keen on Guru):
equal_range只能用来查找key值啊,
如果我要删掉ParentID为3的元素的话就不能用了,
似乎只能用erase + find_if :(

还有,我上面改进后的代码在VC里编译通过,
但在BCB6里却不行,后来查帮助文档才知道VC的STL版本对
set,map,multiset,multimap的erase的返回值定义跟STLport的不同的。
VC的返回值是一个iterator,而STLport的却是void,
我反而觉得VC那种好一些,但C++标准好象是void吧?
这样的话是不是只能用第一个算法了,这样子效率不是很低?

P.S.虽然问题已经解决了,还是想了解多些,^_^
hardstudylulin 2004-04-29
  • 打赏
  • 举报
回复
学习,祝好!
liguangwen 2004-04-29
  • 打赏
  • 举报
回复
各位老大都这位么详细了,我就不用掺和了。多多努力!
Areece 2004-04-29
  • 打赏
  • 举报
回复
如果想要用用非key的条件,就只能遍历了。
另外按照stl的规范来说,map::erase应该返回void,但是vc会返回下一个有效的iterator。至于为什么会返回void的说法,是因为对于map来说,找到下一个元素并不是一件特别简单的事,个中原因可以想想数据结构中的二叉排序树中找下一个元素的算法。所以你只能依赖于返回是void来实现你的算法
map<int, CDir>::iterator it =
find_if(Dirs.begin(), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
while (it != Dirs.end())
{

Dirs.erase(it++);
it = find_if(it, Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
}
来做。
fangrk 2004-04-28
  • 打赏
  • 举报
回复
set/map是不能使用remove(_if)之类的函数的,因为remove(_if)会把符合条件的数据转移到容器末尾,这样就与set/map的自动排序功能冲突了。你要按照自己的思路使用的话,可以把CDir放入vector然后……
Areece 2004-04-28
  • 打赏
  • 举报
回复
再说了,map中的key元素不允许重复,按照你所需要的,只要来一下
Dirs.erase(3);就好了,这不比什么erase加上remove_if好吗?
倒是multimap或者其它的什么已经排好序的,可以用erase + equal_range
Areece 2004-04-28
  • 打赏
  • 举报
回复
struct 和class除了缺省时使用public限定成员之外,是没有区别(当然,除了在从C语言到C++语言的程序员心中巨大的心理暗示:struct只是用来组合数据,而class才是来封装对象的)。

另外
map<int, CDir>::iterator it =
find_if(Dirs.begin(), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
while (it != Dirs.end())
{
it = find_if(Dirs.erase(it), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
}

不好意思,这样效率好像高点,^_^,也不是最好效率的方法,你应该使用
map的equal_range方法
pair<map<int, CDir>::iterator, map<int, CDir>::iterator> range = Dirs.equal_range(3);
Dirs.erase(range.first, range.second);
map是按照key进行排序过的,所以用equal_range的话,你还可以不用bind这种高级adaptor(我一直认为它很高级)。
jp1984 2004-04-27
  • 打赏
  • 举报
回复
改了更不行,访问权限都变掉了。。改成PUBLIC的话, 还是不行,我试过了。,
jp1984 2004-04-27
  • 打赏
  • 举报
回复
d:\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(492): error C2582: “operator =”函数在“std::pair<_Ty1,_Ty2>”中不可用
with
[
_Ty1=const int,
_Ty2=CDir
]
// 从来没遇到过,我猜PAIR在STL中已经被定义了,所=在PAIR类里面已经被重载。。所以你自己重载的这个函数就没有作用??? 请高手解答。。
cngdzhang 2004-04-27
  • 打赏
  • 举报
回复
类和结构不一样的
cngdzhang 2004-04-27
  • 打赏
  • 举报
回复

struct CDir
声明
改为

class CDir

helva 2004-04-27
  • 打赏
  • 举报
回复
想想结构体与类的区别???

结构体是特殊的类,没有函数声明及实现的类。

结构体一般只完成对数据的抽象、封装,而且它的访问控制是public:。

而类不仅完成对数据的抽象、封装而且还可以包括抽象数据的动作。

而你的程序,对数据的抽象和动作是封装在结构中的。

不符合C++解释器的一贯作风:)
selfwill 2004-04-27
  • 打赏
  • 举报
回复
map<int, CDir>::iterator it =
find_if(Dirs.begin(), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
while (it != Dirs.end())
{
it = find_if(Dirs.erase(it), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
}

不好意思,这样效率好像高点,^_^

selfwill 2004-04-27
  • 打赏
  • 举报
回复
Areece(Keen on Guru),谢谢你的指点!我已经清晰很多了!

那是不是只能写成下面这样?

map<int, CDir>::iterator it =
find_if(Dirs.begin(), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
while (it != Dirs.end())
{
Dirs.erase(it);
it = find_if(Dirs.begin(), Dirs.end(), bind2nd(ptr_fun(IDEqualsN), 3));
}

像remove_if这样的操作既然不宜用于map,
为什么map本身不实现一个remove_if操作,真是的。。。

selfwill 2004-04-27
  • 打赏
  • 举报
回复
up! 弟兄们帮帮忙吧!
jmlt1983 2004-04-27
  • 打赏
  • 举报
回复
可以改为类封装试试,可能是不能用struct
Areece 2004-04-27
  • 打赏
  • 举报
回复
而且map作为一种排序的association container,最好不要调用象remove_if这种会改变其内部数据的函数。
Areece 2004-04-27
  • 打赏
  • 举报
回复
是因为remove_if的原因,在remove_if里面会调用remove_copy_if,而remove_copy_if需要一个非constant的iterator,而map只提供const_iterator。
加载更多回复(5)
在电子设计自动化(EDA)领域,Verilog HDL 是一种重要的硬件描述语言,广泛应用于数字系统的设计,尤其是在嵌入式系统、FPGA 设计以及数字电路教学中。本文将探讨如何利用 Verilog HDL 实现一个 16×16 点阵字符显示功能。16×16 点阵显示器由 16 行和 16 列的像素组成,共需 256 个二进制位来控制每个像素的亮灭,常用于简单字符或图形显示。 要实现这一功能,首先需要掌握基本的逻辑门(如与门、或门、非门、与非门、或非门等)和组合逻辑电路,以及寄存器和计数器等时序逻辑电路。设计的核心是构建一个模块,该模块接收字符输入(如 ASCII 码),将其转换为 16×16 的二进制位流,进而驱动点阵的 LED 灯。具体而言,该模块包含以下部分:一是输入接口,通常为 8 位的 ASCII 码输入,用于指定要显示的字符;二是内部存储,用于存储字符对应的 16×16 点阵数据,可采用寄存器或分布式 RAM 实现;三是行列驱动逻辑,将点阵数据转换为驱动 LED 矩阵的信号,包含 16 个行输出线和 16 个列使能信号,按特定顺序选通点亮对应 LED;四是时序控制,通过计数器逐行扫描,按顺序控制每行点亮;五是复用逻辑(可选),若点阵支持多颜色或亮度等级,则需额外逻辑控制像素状态。 设计过程中,需用 Verilog 代码描述上述逻辑,并借助仿真工具验证功能,确保能正确将输入字符转换为点阵显示。之后将设计综合到目标 FPGA 架构,通过配置 FPGA 实现硬件功能。实际项目中,“led_lattice”文件可能包含 Verilog 源代码、测试平台文件、配置文件及仿真结果。其中,测试平台用于模拟输入、检查输出,验证设计正确性。掌握 Verilog HDL 实现 16×16 点阵字符显示,涉及硬件描述语言基础、数字逻辑设计、字符编码和 FPGA 编程等多方面知识,是学习

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧