F.R.I.D.A.Y.

VS ERROR E1087: 오버로드된 함수 "class::func"의 인스턴스 중 인수 목록 및 개체와 일치하는 인스턴스가 없습니다(개체에 일치를 방해하는 형식 한정자가 있음). 본문

DEV/Tip

VS ERROR E1087: 오버로드된 함수 "class::func"의 인스턴스 중 인수 목록 및 개체와 일치하는 인스턴스가 없습니다(개체에 일치를 방해하는 형식 한정자가 있음).

F.R.I.D.A.Y. 2021. 9. 29. 16:08
반응형

VS ERROR E1087

 


 해당 오류는 여러 이유로 발생할 것으로 생각된다. 따라서, 각 파트에 맞추어 작성하겠다.

 

함수 한정자 const 사용

 코드를 작성할 때, 클래스 메서드에서 멤버 필드에 쓰기를 제한하도록 하는 구문이 있다.

class test{
private:
	int a;
public:
	void accessA() const{
    	a = 5; // error
    }
}

 이런 식의 구조인데, 코드를 보게 되면, accessA 함수 뒤에 const로 한정자가 작성되어 있다. 멤버 함수 뒤에 붙는 const가 객체에 접근해 쓰기를 제한하도록 하는 구성이다.

 

원인

 E1087 에러가 나는 방식 중 하나는 const 메서드에서 에서 일반 메서드를 호출할 때 이다.

int Test::a() const{
	b(1);	// error
    b(1.f);	// error
}

int Test::b(int arg1){

}

const int Test:b(float arg1){

}

 위 코드에서 const 한정자로 제한된 a 함수에서 오버로드 된 일반 메서드 b를 모두 호출한다. 이 경우, 위에서 말한 한정된 메서드에서 일반 메서드를 호출하는 것이 충족되고, C++ 문법상 const로 한정된 메서드의 경우, 그 내부에서 일반 메서드 호출이 불가하다.

 

해결 방법

 따라서 본인의 코드에서 E1087 오류가 발생하면서 위와 같은 문제를 확인했다면, 두 가지 제안이 있는데, (1)호출하는 a함수의 const 지정자를 제거하거나, (2) 한정 메서드 a에서 호출하는 b 메서드를 모드 한정자로 제한시키는 방법이다.

 

방법 1
// a 함수의 const 키워드 제거
int Test::a() //const
{
	b(1);	// error
    b(1.f);	// error
}

int Test::b(int arg1){

}

const int Test:b(float arg1){

}

 

방법 2
// 호출되는 b 메서드 const로 제한
int Test::a() const{
	b(1);	// error
    b(1.f);	// error
}

int Test::b(int arg1) const {

}

const int Test:b(float arg1) const {

}

 해당 오류를 일으키는 새로운 경우가 있는 경우 추가 예정

 

# index

728x90
반응형
Comments