2009-03-27 3 views
4

간단한 질문,이 유효한 C + +입니다 :C++ 메소드 이름을 헤더의 클래스 이름으로 규정 할 수 있습니까?

class Foo 
{ 
    void Foo::doSomething(); 
}; 

질문의 요점은 : 그 클래스 이름과 두 번 콜론을 반복 사용하는 방법 이름 앞에 유효한 클래스 선언 안에?

g ++ 4.2.3을 사용하는 코드를 컴파일하는 데 문제가 있습니다. 코드를 파고 변경하기 전에 여기에 구문을 설명하는 것에 대한 참조를보고 싶습니다. 또는 컴파일러를 다운 그레이드합니다. 이것은 g ++ 3.3.6으로 빌드됩니다.

내가 겪고있는 오류는 (대략) :

Foo.h:3: error: extra qualification ‘Foo::’ on member ‘doSomething’ 

Google은했지만 뭔가를 생각해 내지 못했습니다. 나는 표준을 가지고 있지 않다. 그리고 내가 그랬더라도 권위있는 것을 찾기 위해 꽤 오래 걸릴 것이다. 저는 C++ 언어 변호사가 아닙니다.

+0

Visual Studio (2008)는 "Foo ::"를 허용합니다. –

+0

그래, 나도 알아.하지만 g ++을 사용하여 코드를 작성하려고하는데, 수락 여부에 따라 코드가 다를 수 있습니다. 또는 내 관점에서, VC는 무엇이든 받아들이는 것처럼 보이지만 g ++는 까다 롭습니다. :) – unwind

+0

나는 Foo ::가 불필요하고 최악의 경우 유효하지 않았다고 말할 것입니다. 그러므로 제 의견으로는 삭제를 정당화 할 수 있습니다. – markh44

답변

18

표준을 살펴보면 9.2 절이 관련 부분이 될 것입니다. 나는 BNF에 그렇게 대단한 것은 아니지만 BNF에서 이것이 허용되었다고 말하는 반원들에게는 아무것도 보이지 않았다. 식별자는 BNF에서 "unqualified-id"로 명명됩니다.

G ++은 버전 4.1에서 동작을 변경했으며, 분명히 많은 다른 컴파일러가 이것을 받아 들였지만,이 스타일이 사용 된 것을 본 적이 없으며 왜 누구가 그것을 할 것인지 전혀 모른다. 꽤 다양한 컴파일러에서 오류를 유발하지 않는 것 같으므로,이 스타일에 대한 역사적인 이유가있을 수 있지만 실제로는 유효하지 않다고 말할 수 있습니다.

Google에서 발견 한 좋은 참고 자료는 this page이며 G ++ 4.1의 일부 변경 사항을 설명하려고합니다.

+0

감사합니다. 매우 유용한 답변입니다. 나는 그것을 투표했다. 받아들이 기 전에 잠시 기다려 사람들이 더 많은 표준 검색을 할 수있는 동기를 부여받을 수 있기를 바랍니다. :) – unwind

+0

왜이 구문을 사용하고 싶은지 모르겠지만 어떻게 표시되는지 알 수 있습니다. 일종의. cpp에서 헤더 파일로 복사/붙여 넣기하여 함수를 인라인합니다. –

+0

네, 저도 그렇게 된 것 같습니다. – unwind

4

댄과 마찬가지로 결정적인 결과없이 표준을 검토했습니다. 나는 (세계에서 가장 표준 규격으로 간주) Comeau's on-line compiler와 코드를 시도하고 있어요 : 훨씬 더 많은 C 있기 때문에

line 3: error: qualified name is not allowed in member declaration

이 더이를 복용에 관심이 있다면

, 내가는 comp.lang.c++.moderated 뉴스 그룹에 질문을 게시하시기 바랍니다 ++ 여기있는 언어 변호사보다.

+0

감사! 나는 이것을 하나 투표했지만 지금은 단호한 대답을 받아 들였습니다. 나는 그것이 합리적이라고 생각합니다. – unwind

+0

표준 검사 (및 오류보고, 표현력이 더 뛰어남)를 위해 Comeau 컴파일러도 사용합니다. 누구에게나 좋은 충고입니다. Comeau (온라인 또는 구매)로 코드 스 니펫을 확인하십시오. –

관련 문제