Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 运算符中“this”的用法_C++ - Fatal编程技术网

C++ 运算符中“this”的用法

C++ 运算符中“this”的用法,c++,C++,我有这样的想法: CLASS CLASS::operator|(CLASS& right) { return binop(*((CLASS*) this), right, OP_OR); } int bit = 0x02; CLASS result = *this | (CLASS)bit; CLASS result = *this | (CLASS &)bit; CLASS CLASS::operator| (CLASS &&right); //C

我有这样的想法:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11
阶级只是一些阶级。 比诺普的原型是

CLASS-binop(CLASS&left,CLASS&right,OP)

<>这一切都很好,使用Visual C++ 2010编译,但在G++中失败了:错误:

someheader.h: In member function 'void CLASS::set(int64_t)':
someheader.h:469:29: error: no match for 'operator|' in '*(CLASS*)this | CLASS(bit)'
someheader.h:469:29: note: candidate is:
someheader.h:376:1: note: CLASS CLASS::operator|(CLASS&)
someheader.h:376:1: note:   no known conversion for argument 1 from 'CLASS' to 'CLASS&'

现在,我只是把当前对象(*this)作为一些参数传递给问题,所以我明确地把它删除了指针上的 const 限定符,它工作得很好,似乎欺骗VisualC++编译器接受它作为一个普通指针。g++似乎不喜欢这样。如果我删除强制转换,它仍然会给我一个错误,因为

这个
是const限定的。我对操作符的左边和右边的大小所做的工作要求两者都是可变的


从我所能收集到的信息来看,我传递某个对象并将其转换为函数调用中的引用似乎存在问题。。。这对我来说没什么意义。有什么建议吗?

您正在呼叫
接线员
类似这样的电话:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11
你的接线员需要一个参考

CLASS CLASS::operator| (CLASS &right);
为了解决GCC的这一问题,我发现要么这样称呼它:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11
或者像这样定义运算符:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11

两者都使它返回正确的结果。不过,我不能保证其中一个是解决方案。

您正在呼叫的是
操作员
类似以下内容:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11
你的接线员需要一个参考

CLASS CLASS::operator| (CLASS &right);
为了解决GCC的这一问题,我发现要么这样称呼它:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11
或者像这样定义运算符:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}
int bit = 0x02;
CLASS result = *this | (CLASS)bit;
CLASS result = *this | (CLASS &)bit;
CLASS CLASS::operator| (CLASS &&right); //C++11

两者都使它返回正确的结果。但我不能保证其中一个是解决方案。

Visual Studio违反了这里的标准


你的右手参数是临时的,根据C++的规则,临时不能匹配非const引用。

VisualStudio违反了这里的标准。< /P>
CLASS CLASS::operator| (CLASS &right);


你的右手参数是临时的,根据C++的规则,临时不能匹配非const引用。

什么是与Fuky<代码>((类*))< /Cl> >如果函数是类的成员?哦,不应该是这样的。也许您的
集合
函数值得一看,因为它就是错误所在。实际上,
CLASS&right
作为
const CLASS&right
是否存在问题?错误消息清楚地显示了它的错误位置,而这正是我使用
操作符的时候。我已经列出了操作员实现;左侧和右侧的大小不应为常量。为什么binop使用非常量引用?它真的修改了参数吗?@Pochi,不要使用C-cast删除“const”。这是一个bug。如果函数是类的成员,那么时髦的
*((CLASS*)this)
有什么用?哦,不应该是这样。也许您的
集合
函数值得一看,因为它就是错误所在。实际上,
CLASS&right
作为
const CLASS&right
是否存在问题?错误消息清楚地显示了它的错误位置,而这正是我使用
操作符的时候。我已经列出了操作员实现;左侧和右侧的大小不应为常量。为什么binop使用非常量引用?它真的修改了参数吗?@Pochi,不要使用C-cast删除“const”。这是一个bug。临时对象应该作为被调用方中的引用进行匹配。是这就是你说的-,我应该先在单独的一行中创建对象?我只是好奇,但是你有没有可能参考一下标准中的哪个地方,它是这么说的?嗯,我想这已经解决了。。。谢谢临时引用不能绑定到非常量引用。MSVC甚至在编译时告诉你它违反了这条规则。请看警告。临时引用不能绑定到非常量引用。MSVC甚至在编译时告诉你它违反了这条规则。看看这些警告。@MooingDuck:没有警告。如果有,我就不会处于这样的位置。临时的应该匹配作为被调用方的引用。是这就是你说的-,我应该先在单独的一行中创建对象?我只是好奇,但是你有没有可能参考一下标准中的哪个地方,它是这么说的?嗯,我想这已经解决了。。。谢谢临时引用不能绑定到非常量引用。MSVC甚至在编译时告诉你它违反了这条规则。请看警告。临时引用不能绑定到非常量引用。MSVC甚至在编译时告诉你它违反了这条规则。看看这些警告。@MooingDuck:没有警告。如果有,我就不会处于这样的境地。B这两个都是错误的,因为它们修改了“正确”而不是“正确”的副本。@MooingDuck,据我所见,这就是OP想要的。我误读了第二个,应该可以。我还以为bit是一个类,它会使代码完全不同。这是一个很好的答案。B这两个答案都是错误的,因为它们修改了“正确”而不是“正确”的副本。@MooingDuck,从我所看到的,这就是OP想要的。我误读了第二个答案,应该可以。我还以为bit是一个类,它会使代码完全不同。这个答案很好。
CLASS CLASS::operator| (CLASS &right);