친구

2009-03-18 4 views
22

내가 thusly 히 친구를 선언 할 때 g ++ 컴파일러는이 오류와 함께 불만을 선언 할 때 클래스 키를 선언해야합니다친구

friend MyClass; 

대신

friend class MyClass; 

을 왜해야 클래스 키워드가 필요합니까? (볼랜드 C++ 컴파일러 인 BTW는 필요하지 않습니다.)

컴파일러는 단순히 심볼 테이블에서 MyClass를 찾아 클래스로 선언했다고 말할 수 있습니까? (그것은 분명히 MyClass가 선언하지 않았을 때 불평하기 때문에 어쨌든 look-up을하고있다)

나는 클래스의 forward 선언을 만드는 것과 같지 않다 : 나는 여전히 위의 클래스를 선언했거나 적어도 선언해야한다. 앞으로 그것을 선언했다. 그렇지 않으면 그것은 단지 나 구문 소금 것 같아,

그것은 나에게 의미를 것이다 (실제로 좋은 것)

friend class MyClass; 

가 필요한 경우 앞으로 선언을 만드는 경우.

나는 명랑하게 거의 20 년 동안 어떤 컴파일러 불만을 가진 클래스 또는 구조체 키워드없이 친구에게 문을 사용하고있다. 이것은 상당히 새로운 것입니까?

+1

20 년! 당신은 Bjorn과 함께 일했음에 틀림 없습니다. –

+0

1989 년 대학원 때 C 프론트를 사용했습니다. 저는 1991 년 이래로 대부분 Borland C++를 사용했습니다. –

+3

@Martin : Bjorn ?! Lol. –

답변

22

나는 이것에 대해 놀랐습니다 (그 결과는 이전의 잘못된 대답을 삭제로). C++ 03 표준은 11.4에서 다음과 같이 나타냅니다 :

정교한 형식 지정자는 클래스에 대한 friend 선언에 사용됩니다.

정교 형 지정자의 클래스 키가 필요합니다

는 그런 다음에하는 것이 각주, 오해가 없습니다 확인합니다. ...에 관해서는 지금

GCC 내가 그 누락 된 클래스 키에 대해 불만을 가지고있는 유일한 컴파일러이지만, 우리가 멀리 뭔가 아닌 표준을 얻을시키는 다른 컴파일러처럼 보인다 이론적 근거 - 내가하는 것보다 컴파일러 (또는 표준)에 대해 더 많이 알고있는 사람에게 물어보아야 할 것이다.

+2

'friend', 클래스 키없이 g ++ 4.7.0/4.7.3에서 옵션 사용 가능 '-std = C++ 11' – Interarticle

+0

C++ 11에 따라 대답을 업데이트하면 C++ 11에서는 __extended friend declarations__을 도입했습니다. https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_extended_friend_declaration3?lang=en을 참조하십시오. – Destructor

22

질문의 요지 인 은 ISO/IEC 14882 : 2003에서 지정하는 방법이므로 (섹션 7.1.4)입니다. friend 구조는 본질적으로 지정된 바와 같이 :

<declaration>이 클래스 구조체 템플릿 또는 기능의 유효 선언서
friend <declaration> 

.

class MyClass; 
또는

:

struct MyClass; 

따라서,

MyClass; 

는 반면, 유효한 선언 아니다.

뎀 대응을 위해 :

friend class MyClass; 

또는

friend struct MyClass; 
+0

고마워, 너희들 오늘 내 베이컨을 구해 줬어. – Rokujolady

+0

좋은 답변, GCC 바위 :) – ierax

+0

만약'MyClass'가 클래스 템플릿이라면'friend' 선언은'template'도 필요합니다. –