2011-02-24 4 views
0

예상대로 컴파일되지 않는 다음 코드가 있습니다. 나는 정적 멤버 함수를 가진 클래스와 그것을 사용하려고하는 헤더를 포함하는 또 다른 클래스를 가지고있다. 그것은 작동하지 않는 것 같습니다.정적 멤버 함수가 예상대로 작동하지 않습니다.

static bool validLocation(int _x) // within class A 
{ 
    return false; 
}; 

클래스 B는 클래스 A를 포함하고 그 기능 중 하나에서 다음 호출이 : 목적을 읽기 위해 분명히 이러한 단순화

if (!(A::validLocation(180))) 
    continue; 

을하지만, 왜이 허용되지 않습니다?

모호함을 드려 죄송합니다. 오류 메시지는 다음과 같습니다.

"A::validLocation(int)", referenced from: B::functionThatCallsThis() in B.o 

Symbols not found. 
Collect2: ld returned 1 exit status 

정적 함수는 헤더 파일에 선언 된대로 public입니다.

+4

컴파일러 오류 메시지입니다) 그것을위한 – 0xC0000022L

+0

와우, 감사합니다. 비몽사몽. – jackz

+0

을 업데이트하고 모든 네임 스페이스 ('::'로 시작)에서 이스케이프 처리를 시도한 다음 클래스의 네임 스페이스를 명시 적으로 정규화 했습니까? 아마'class B'는 A를 보지만 올바른 것이 아닙니다. 그것을 배제하기 위해 B를 A의 '친구'로 임시적으로 만들 수 있습니다 (그러면 숨겨진 멤버 기능 정도는 아닙니다). – 0xC0000022L

답변

2

편집 : 바이너리를 만들기 위해 A.oB.o을 함께 연결하는 것을 잊지 않았습니까? A.o이 포함되지 않고 컴파일러가 정적 함수를 인라인하지 않았던 것 같습니다. 또한

당신은 확실히 필요하지 않은 것 함수의 끝에 ;을 가지고 있고 (내가 기억 할 수없는) 당신이 준 오류 메시지에서

+0

아니요. 그것은 분명 공개되어 있습니다. 이상한. 미안하지만, 나는 그저 내 메시지의 애매함이 얼마나 막연한 지 깨달았다. 나는 그것을 정리할 것이다 – jackz

+0

길잃은 세미콜론은 유효하지 않다. 그것은 단순히 비어있는 표현입니다. PCLINT와 같은 도구는이를 지적 할 것입니다. – 0xC0000022L

+0

이 함수가 실제로 클래스 A 내부에서 정의 된 경우 암시 적으로 인라인되어야합니다. 맞습니까? 객체 파일을 포함 할 필요가 없습니다. 해당 오브젝트 파일이 존재하지 않아도됩니다. –

3

유효하지 않을 수 있습니다, 나는 '당신은 때로 믿을 가정거야 객체를 함께 연결하지 않거나 정의하기 전에 A::을 볼 수 없기 때문에 validLocation()을 자유 함수로 선언했습니다. 여기서 정보의 양을 감안할 때 알기가 어렵습니다.

편집 :

지금 오류 메시지가 좀 더 분명하다, 당신은 링커에 대한 올바른 오브젝트 파일을 포함하지 않는 것 같습니다.

0

함수를 정의 할 때 validLocation(), .cpp라는 별개의 파일로 정의하고 있습니까? 그렇다면, 당신과 같이, 함수 이름 앞에 ::를 넣어 필요없는 일 이죠

static bool A::validLocation(int _x) // within class A 
{ 
    return false; 
}; 
관련 문제