VS2005 오류 해결 error C2662

2882 단어

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 수식자가 없습니다.그래서 힌트 수식자가 버려졌어요.깨우쳐 줄게, 수식부까지.

좋은 웹페이지 즐겨찾기