Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++;编译错误,运算符不匹配 我试图为Android构建一些已经在Win32上工作的C++代码。我有一个问题,重载运算符。例如:_C++_Compiler Errors_Operators - Fatal编程技术网

C++;编译错误,运算符不匹配 我试图为Android构建一些已经在Win32上工作的C++代码。我有一个问题,重载运算符。例如:

C++;编译错误,运算符不匹配 我试图为Android构建一些已经在Win32上工作的C++代码。我有一个问题,重载运算符。例如:,c++,compiler-errors,operators,C++,Compiler Errors,Operators,代码: 其中Vector2是上面声明的类。声明如下: class Vector2 { public: //Constructors Vector2() : x(0.0f), y(0.0f){} Vector2(GLfloat _x, GLfloat _y) : x(_x), y(_y) {} Vector2(double _x, double _y) : x(static_cast<float>(_x)), y(static_cast<float>(_y)) {} Vec

代码:

其中Vector2是上面声明的类。声明如下:

class Vector2
{
public:
//Constructors
Vector2() : x(0.0f), y(0.0f){}
Vector2(GLfloat _x, GLfloat _y) : x(_x), y(_y) {}
Vector2(double _x, double _y) : x(static_cast<float>(_x)), y(static_cast<float>(_y)) {}
Vector2(int _x, double _y) : x(static_cast<float>(_x)), y(static_cast<float>(_y)) {}
Vector2(double _x, int _y) : x(static_cast<float>(_x)), y(static_cast<float>(_y)) {}
Vector2(int _x, int _y) : x(static_cast<float>(_x)), y(static_cast<float>(_y)) {}
Vector2(GLfloat * pArg) : x(pArg[0]), y(pArg[1]) {}
Vector2(const Vector2 & vector) : x(vector.x), y(vector.y) {}

//Vector's operations
GLfloat Length();
Vector2 & Normalize();
Vector2 operator + (Vector2 & vector);
Vector2 & operator += (Vector2 & vector);
Vector2 operator - ();
Vector2 operator - (Vector2 & vector);
Vector2 & operator -= (Vector2 & vector);
Vector2 operator * (GLfloat k);
Vector2 & operator *= (GLfloat k);
Vector2 operator / (GLfloat k);
Vector2 & operator /= (GLfloat k);
Vector2 & operator = (Vector2 vector);
Vector2 Modulate(Vector2 & vector);
GLfloat Dot(Vector2 & vector);
void Set(GLfloat _x, GLfloat _y);

//access to elements
GLfloat operator [] (unsigned int idx);

//data members
float x;
float y;
};
但是,如果我像这样重写上面的代码:

Vector2 uv0 =  textures.back()->m_uv0;
Vector2 uvt =  textures.back()->m_uvt;

Vector2 vec1 = Vector2(uv0.x * m_uvt.x, uv0.y * m_uvt.y);
Vector2 vec2 = Vector2(0.01f,0.01f);

uv0 = m_uv0 + vec1 + vec2;
编译期间不会出现任何错误。 我不明白,这愚蠢错误的原因是什么。
如果您向我解释如何解决这个问题,我将非常高兴。

您正在尝试将临时对象作为非常量引用传入。更改
运算符+
的签名以获取常量引用:

Vector2 operator + (const Vector2 & vector);

第二个示例工作的原因是您现在正在命名Vector2对象,它们不再是临时对象。

不可能将r值绑定到非常量引用

这一行:

uv0 = m_uv0 + Vector2(uv0.x * m_uvt.x, uv0.y * m_uvt.y) + Vector2(0.01f,0.01f);
相当于:(我将参数替换为
PARAMS
,以使示例更具可读性):

这里
Vector2(PARAMS)
将创建一个临时对象。也就是说,您试图将r值引用传递给运算符重载,而编译器将找不到匹配项,因为您的运算符声明为:

Vector2 operator+ (Vector2& vector);
有关为什么临时表不能绑定到非常量引用的更多信息,请参见以下内容:

在第二个示例中首先声明两个
Vector2
对象,然后将它们作为与运算符重载匹配的l值引用传递给运算符

解决此问题并让运算符重载同时获取l值和r值引用的一种方法是将其声明为获取对
const
的引用,因为将r值绑定到对
const
的引用是完全正确的。请参阅的答案,了解如何做到这一点

通常,如果不打算修改参数,则应始终将引用函数声明为引用
const

引用绑定示例:

Vector2& ref1 = Vector2(); // Error, trying to bind r-value to non-const ref.
Vector2 v;
Vector2& ref2 = v; // OK, v is an l-value reference.

// It is however OK to bind an r-value to a const reference:
const Vector& ref3 = Vector2(); // OK.

第一个操作数可能还允许
const
。您在win32上使用的编译器是什么?接受该代码是错误的。@aschepler不幸的是,MSVC偏离了标准。。。如果它允许这样做,我不会感到惊讶:/一些页面建议这是在MSVC 2003中修复的。我只是想知道是什么版本。我用的是MSVC Express 2012。这个代码甚至可以毫无问题地工作。我理解我的错误。谢谢大家。如果我没有将代码移植到android,我就不会知道这个问题。很奇怪,MSVC这么多地偏离了标准。
uv0 = (m_uv0.operator+(Vector2(PARAMS))).operator+(Vector2(PARAMS));
Vector2 operator+ (Vector2& vector);
Vector2& ref1 = Vector2(); // Error, trying to bind r-value to non-const ref.
Vector2 v;
Vector2& ref2 = v; // OK, v is an l-value reference.

// It is however OK to bind an r-value to a const reference:
const Vector& ref3 = Vector2(); // OK.