1

我有这样的事情:

CLASS CLASS::operator|(CLASS& right) {
    return binop(*((CLASS*) this), right, OP_OR);
}

CLASS 只是一些类。binop 的原型是

CLASS binop(CLASS& left, CLASS& right, OP 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指针上的限定符,这工作正常并且似乎欺骗 Visual C++ 编译器将其作为普通指针。g++ 似乎不喜欢这个。如果我删除演员表,它仍然会给我一个错误,因为this它是 const 限定的。我对运算符的左右大小所做的操作要求两者都是可变的。

据我所知,我传递一些对象并将其转换为函数调用中的引用似乎存在问题......这对我来说没有多大意义。有什么建议么?

4

2 回答 2

6

Visual Studio 在这里违反了标准。

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

于 2012-04-28T05:42:23.283 回答
1

你正在调用这样的operator|东西:

int bit = 0x02;
CLASS result = *this | (CLASS)bit;

您的运营商会参考。

CLASS CLASS::operator| (CLASS &right);

为了为 GCC 解决这个问题,我发现要么这样称呼它:

CLASS result = *this | (CLASS &)bit;

或像这样定义运算符:

CLASS CLASS::operator| (CLASS &&right); //C++11

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

于 2012-04-28T05:22:45.213 回答