VS2005 오류 해결 error C2662
1. 오류 출처:
프로그램을 컴파일할 때 다음과 같은 오류가 발생했습니다.
...
1>Session.cpp
1>e:\comm\commserver\session.cpp(24) : error C2662: 'Session::getSock' : cannot convert 'this'
pointer from 'const Session' to 'Session &'
...................................
2. 잘못된 번호에 대한 설명:
오류 알림을 보십시오. 함수 getSock은 이 포인터를 const Session 형식에서 Session & 형식으로 변환할 수 없습니다.못 봤어, MSDN 해석 봐.
Error Message
'function' : cannot convert 'this' pointer from 'type1' to 'type2'
The compiler could not convert the this pointer from type1 to type2.
This error can be caused by invoking a non-const member function on a const object.
Possible resolutions:
Remove the const from the object declaration.
Add const to the member function.
이 포인터를 유형 type1에서 유형 type2로 변환할 수 없습니다.문제가 발생하는 원인은 종종 하나의 const 형식의 대상으로 비const 형식의 구성원 함수를 호출하기 때문이다.방법 1: 대상의 const 수식자 제거 방법 2: 호출된 함수를const 함수로 변경합니다.
3. 해결 방법
MSDN의 해석에 의하면 알 수 있다.내 getSock 함수는 다음과 같습니다Socket getSock();
호출되는 환경은 다음과 같습니다.
Session& Session::operator=(const Session &session)
{
m_sock = session.getSock();
//.......
return *this;
}
보았습니다. 대상session은const 대상입니다. 그러나 getSock 함수는 비const 구성원 함수입니다.
getSock() 함수에 대한 선언은 다음과 같이 수정됩니다.
Socket getSock()const;
실현에 상응하는 수정을 하다.번역이 통과되다.
4. 왜 const 대상은 비const 구성원 함수를 호출할 수 없습니까?
컴파일러가 제한을 했습니다. const 대상은const 구성원 함수만 호출할 수 있습니다. 왜냐하면const 구성원 함수는 속성을 수정할 수 없기 때문에 이런 조작은 안전합니다.대상이 구성원 함수를 호출하면 포인터 A*constthis(A는 유형)를 전달하지만, const 대상이 구성원 함수를 호출할 때 다음과 같은 전환을 합니다. const A *constthis.이 경우 구성원에 대한 수정은 모두 틀릴 수 있습니다.this가 가리키는 대상도const로 수식했기 때문입니다.const로 수식하는 것은 일종의 제약을 가하기 위해서입니다. 컴파일할 때 오류를 발견할 수 있는 것이지 실행 기간에 발견하는 것이 아닙니다.
const 대상이 구성원 함수를 호출할 때, 컴파일러는 호출된 함수가const 형식이라고 생각합니다.그러나 실제는 아니기 때문에 유형이 일치하지 않으면 오류를 보고할 수 있다.
이 테스트 코드는 인터넷에서 따온 것이다.
class Point3d
{
public:
Point3d(float x=0.0,float y=0.0,float z=0.0)
:_x(x),_y(y),_z(z)
{
}
float GetX() {return _x;}
float GetY() {return _y;}
float GetZ() {return _z;}
private:
float _x,_y,_z;
};
inline ostream& operator<<(ostream&out,const Point3d& pd)
{
out<<pd.GetX()<<endl;
return out;
}
컴파일 오류(codeblock minGW):
G:\sourceCode\constTest\constTest\main.cpp|23|error: passing 'const Point3d' as 'this' argument
of 'float Point3d::GetX()' discards qualifiers|
discards qualifiers는 한정자를 버렸다는 뜻입니다.이렇게 이해할 수 있다,pd.GetX () 작업 시 pd는 const 객체이므로 호출된 GetX () 는 다음과 같습니다
float GetX() const {return _x;}
그러나 실제로 이 함수는const 수식자가 없습니다.그래서 힌트 수식자가 버려졌어요.깨우쳐 줄게, 수식부까지.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.