Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STD::填充和STD::FILIN N错误“错误C2679”_C++_Visual Studio 2010_C++11_Std - Fatal编程技术网

C++ STD::填充和STD::FILIN N错误“错误C2679”

C++ STD::填充和STD::FILIN N错误“错误C2679”,c++,visual-studio-2010,c++11,std,C++,Visual Studio 2010,C++11,Std,我想做的是: 我在一个不是我的代码中工作,我正在尝试重构它。这里有一个struct类型的对象,我们把它叫做MY_结构,里面有一些参数。在该代码的旧版本中,他们使用memset在所有参数中使用0初始化结构。所以,我尝试将那个MMSET更改为一个更高的C++标准方法,即填充或FILIN。p> 还有,我应该提到。。。这里没有数组,只是一个对象,所以我要做的就是用0来初始化这个对象 memset方法工作得非常好,看起来像 this:memset(&MyScruct, 0, sizeof(MySc

我想做的是:

我在一个不是我的代码中工作,我正在尝试重构它。这里有一个struct类型的对象,我们把它叫做MY_结构,里面有一些参数。在该代码的旧版本中,他们使用memset在所有参数中使用0初始化结构。所以,我尝试将那个MMSET更改为一个更高的C++标准方法,即填充或FILIN。p> 还有,我应该提到。。。这里没有数组,只是一个对象,所以我要做的就是用0来初始化这个对象

memset方法工作得非常好,看起来像

this:memset(&MyScruct, 0, sizeof(MyScruct));
我试过什么:

我试着使用一种填充和填充方式,如下所示:

std::fill(&MyScruct, &MyScruct+ sizeof(MyScruct), 0);
而且

std::fill_n(&MyScruct, sizeof(MyScruct), 0);
其中MyScruct是我的结构MyScruct

在这两种情况下,我都得到了相同的错误:

错误C2679:二进制“=”:找不到使用右手的运算符 “const int”类型的操作数或没有可接受的转换


你知道这里发生了什么或为什么吗?

如果代码是用memset正确编写的,那么就没有理由更改它。fill不能代替memset

在现代C++中,设计一个类需要MeSET是不好的。但是,如果您使用的是其他人的类,而该类是以这种方式设计的,那么使用他们的类是正确的

在现代C++中,你将设计类,以便值初始化重置它:

MyScruct = MY_STRUCT{};

此代码可能与memset具有相同的效果,也可能与memset不具有相同的效果,具体取决于我的结构的详细信息。

如果代码是使用memset正确编写的,则没有理由更改它。fill不能代替memset

在现代C++中,设计一个类需要MeSET是不好的。但是,如果您使用的是其他人的类,而该类是以这种方式设计的,那么使用他们的类是正确的

在现代C++中,你将设计类,以便值初始化重置它:

MyScruct = MY_STRUCT{};

这段代码可能有也可能没有memset的效果,这取决于我的结构的细节。

在原始代码中,memset将完全忽略类型系统,只将字节写入原始内存,破坏以前存在的任何内容,我不得不质疑运行良好的memset方法是否真的运行良好,或者是真的没有定义

另一方面,std::fill使用类型系统,并设置正确类型的值。0不是正确类型的值,并且不可分配给该类型,因此不能用零填充结构

没有数组,只是一个对象

那么您肯定不想传递sizeofMyStruct,因为这表示要填充多少类型的对象。您只有一个对象,没有包含sizeofMyStruct元素的数组

sizeofMyStruct是memset的正确参数,因为它适用于字节,而不是对象。您需要告诉memset要写入多少字节。但是std::fill和std::fill_n是完全错误的,它们在对象中计数,而不是字节,除非碰巧sizeofMyStruct==1,但即使如此,它也是一个等待发生的错误

我尝试把那个MMSET更改成一个更高的C++标准方法,它是填充或填充。

STD::FuffSt::FILIN是C++的方式,将新的值分配给一系列的值,而不是MeSET的C++版本。MeSET的C++版本是MeSET! 如果您不想重置结构的值,只需初始化它,那么正确的方法就是:

MyStruct s = { };

<>这是完全有效的C++,它可以在任何版本中工作,从C++ 98到最新标准。这比使用memset更简单、更安全、可读性更强。

在原始代码中,memset将完全忽略类型系统,只将字节写入原始内存,破坏以前存在的任何内容,我不得不质疑运行良好的memset方法是否真的运行良好,还是真的未定义

另一方面,std::fill使用类型系统,并设置正确类型的值。0不是正确类型的值,并且不可分配给该类型,因此不能用零填充结构

没有数组,只是一个对象

那么您肯定不想传递sizeofMyStruct,因为这表示要填充多少类型的对象。您只有一个对象,没有包含sizeofMyStruct元素的数组

sizeofMyStruct是memset的正确参数,因为它适用于字节,而不是对象。您需要告诉memset要写入多少字节。但是std::fill和std::fill_n是完全错误的,它们在对象中计数,而不是字节,除非碰巧sizeofMyStruct==1,但即使如此,它也是一个等待发生的错误

我尝试把那个MMSET更改成一个更高的C++标准方法,它是填充或填充。

STD::FuffSt::FILIN是C++的方式,将新的值分配给一系列的值,而不是MeSET的C++版本。MeSET的C++版本是MeSET! 如果你 你不想重置结构的值,只是初始化它,正确的方法是:

MyStruct s = { };


<>这是完全有效的C++,它可以在任何版本中工作,从C++ 98到最新标准。这比使用memset更简单、更安全、更可读。

fill和fill\n希望填充数组,就像doing=0;对于数组中的每个元素。我猜您实际上想将结构的每个字节设置为0;如果是这样的话,那么fill和fill\n不是正确的工具。解释您试图实现的目标会改善问题。我的结构是什么?之所以会发生这种情况,是因为fill尝试执行与*&MyScruct=0;等效的操作;。尝试一个旧的好的memset.fill和fill\n期望填充一个数组,就像doing=0;对于数组中的每个元素。我猜您实际上想将结构的每个字节设置为0;如果是这样的话,那么fill和fill\n不是正确的工具。解释您试图实现的目标会改善问题。我的结构是什么?之所以会发生这种情况,是因为fill尝试执行与*&MyScruct=0;等效的操作;。尝试一个旧的好的memset。我已经尝试过了,但是不起作用,因为他们没有使用c++11,我想。。。他们正在使用c++03。@DumitruVlad我建议不要更改原始代码。在默认构造函数中为我的结构成员指定0/默认值如何?它不会产生与MyScruct=MY_STRUCT{};相同的效果吗@miradham他可能不想改变类的定义;即使如此,这也会带来另一个可能的失败点,例如,可能你忘记设置一个成员Short answer@miradham,我不能这样做,因为我不允许更改代码。我已经尝试过了,但不起作用,因为他们不使用c++11,我想。。。他们正在使用c++03。@DumitruVlad我建议不要更改原始代码。在默认构造函数中为我的结构成员指定0/默认值如何?它不会产生与MyScruct=MY_STRUCT{};相同的效果吗@miradham他可能不想改变类的定义;即便如此,这也会带来另一个可能的失败点,例如,也许你忘了设置一个membersshort-answer@miradham,我不能这样做,因为我不允许更改代码。我不得不质疑运行良好的memset方法是否真的运行良好,或者是真的没有定义:你能详细说明一下吗?它对豆荚类型是安全的,对吗?@joe_chip它对普通的可复制类型是安全的。所有POD类型都是可复制的。我们不知道OP的类型是否是POD。我不得不质疑运行良好的memset方法是否运行良好,或者是否真的未定义:你能详细说明一下吗?它对豆荚类型是安全的,对吗?@joe_chip它对普通的可复制类型是安全的。所有POD类型都是可复制的。我们不知道OP的类型是不是吊舱。