2013-08-25 3 views
3

저는 이미 win32에서 작동하는 C++ 코드를 android 용으로 빌드하려고합니다. 오버로드 된 운영자에게 문제가 있습니다.C++ 컴파일 오류, 연산자 일치 없음

코드 : : 예를 들어 Vector2 위 declarated 클래스입니다

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); 

. 그것의 선언은 다음과 같습니다가 METTER하지 않기 때문에이 클래스의

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; 

컴파일하는 동안 오류가 없을 것

는 그러나 불행하게도 나는 오류를 받아 봐. 나는이 바보 같은 오류의 원인을 이해할 수 없다. 이 문제를 해결하는 방법을 설명하면 매우 기쁩니다.

+0

? 그 코드를 받아들이는 것은 잘못되었습니다. – aschepler

+0

@aschepler 불행히도 MSVC는 표준에서 벗어나 있습니다 ... 허용 된 경우 놀라지 않을 것입니다 :/ – krsteeve

+0

일부 페이지는 MSVC 2003에서 수정 된 것이므로 어떤 버전인지 궁금합니다. – aschepler

답변

3

const가 아닌 참조r 값 결합하는 것은 불가능하다.

이 줄 :

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); 

먼저 두 Vector2 객체를 선언하고 리터 값으로 운영자에게 운영자 과부하를 일치 참조를 전달할 두 번째 예에서는 How come a non-const reference cannot bind to a temporary object?

: const가 아닌 참조이를 참조하십시오.

문제를 해결하고 연산자 오버로드가 l-value 및 r-value 참조를 모두 사용하도록하는 한 가지 방법은 const에 대한 참조를 취하는 것으로 선언하는 것입니다. r-value를 참조에 바인딩하는 것이 완벽하므로 const. 이 작업을 수행하는 방법은 krsteeve의 대답을 참조하십시오.

일반적으로 참조를 취하는 함수는 인수를 수정하지 않으려면 const을 참조하는 것으로 선언해야합니다. 참조

예 바인딩 : 당신이는 Win32에 어떤 컴파일러를 사용하고

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. 
2

임시 개체를 비 const 참조로 전달하려고합니다. CONST 참조를 적용하려면 operator +의 서명을 변경 : 두 번째 샘플이 작동

Vector2 operator + (const Vector2 & vector); 

이유는 당신이 지금 Vector2 오브젝트의 이름을 지정하고 있는지, 그들은 더 이상 일시적인 것 없습니다.

+1

첫 번째 피연산자는 아마도'const'를 허용해야합니다. – aschepler

+0

@aschepler 코드 샘플은 const로 흩어져 있어야합니다. – krsteeve