ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C编译错误,不匹配运算符

2019-08-31 16:07:42  阅读:147  来源: 互联网

标签:c operators compiler-errors


我正在尝试为Android构建一些已经在win32上工作的C代码.我有一个问题,重载运算符.例如:

码:

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

uv0 = m_uv0 + Vector2(uv0.x * m_uvt.x, uv0.y * m_uvt.y) + Vector2(0.01f,0.01f);

其中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;
};

我不会在这里列出这个类的定义,因为它没有得到满足.

但不幸的是我发现了一个错误:

G:/PROJECT266/projects/PROJECT266//jni/../jni/SBE/source/Sprite.cpp: In member function'void Sprite::AddTex(TEX::GUItex)':
G:/PROJECT266/projects/PROJECT266//jni/../jni/SBE/source/Sprite.cpp:103:57: error: no match for 'operator+' in '((Sprite*)this)->Sprite::m_uv0 + Vector2((uv0.Vector2::x *((Sprite*)this)->Sprite::m_uvt.Vector2::x), (uv0.Vector2::y * ((Sprite*)this)->Sprite::m_uvt.Vector2::y))'
G:/PROJECT266/projects/PROJECT266//jni/../jni/SBE/source/Sprite.cpp:103:57: note: candidates are:
G:/PROJECT266/projects/PROJECT266//jni/../jni/SBE/source/SBMath.h:38:10: note: Vector2 Vector2::operator+(Vector2&)
G:/PROJECT266/projects/PROJECT266//jni/../jni/SBE/source/SBMath.h:38:10: note:   no known conversion for argument 1 from 'Vector2' to 'Vector2&'

但是,如果我像这样重写上面的代码:

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;

编译期间不会出现任何错误.
我无法理解,这个愚蠢错误的原因是什么.
如果你解释我如何解决这个问题,我会很高兴的.

解决方法:

无法将r值绑定到非const引用.

这一行:

uv0 = m_uv0 + Vector2(uv0.x * m_uvt.x, uv0.y * m_uvt.y) + Vector2(0.01f,0.01f);

相当于:(我用PARAMS替换了参数,使我的例子更具可读性):

uv0 = (m_uv0.operator+(Vector2(PARAMS))).operator+(Vector2(PARAMS));

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

Vector2 operator+ (Vector2& vector);

有关为什么temporaries不能绑定到非const引用的更多信息,请参阅:How come a non-const reference cannot bind to a temporary object?

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

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

通常,如果您不打算修改参数,则应始终声明将引用作为引用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.

标签:c,operators,compiler-errors
来源: https://codeday.me/bug/20190831/1776842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有