TypEdef를 통해 친구를 선언 할 수없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/392120

  •  23-08-2019
  •  | 
  •  

문제

왜 클래스 이름의 typedef가 친구 선언의 클래스 이름처럼 작동하지 않는지 아는 사람이 있습니까?

class A
{
public:
};

class B : public A
{
public:
   typedef A SUPERCLASS;
};

typedef A X;

class C
{
public:
   friend class A;             // OK
   friend class X;             // fails
   friend class B::SUPERCLASS; // fails
};
도움이 되었습니까?

해결책

현재는 할 수 없습니다. 나는 아직 그 이유를 모른다 (흥미로운 것을 발견하기 때문에 그것을 찾아보세요). 업데이트 : Friends로서 Typedef-Names를 지원하기위한 첫 번째 제안에서 이유를 찾을 수 있습니다. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1520.pdf . 그 이유는 표준이 정교화 된 유형의 특징 만 지원하기 때문입니다. 그것들 만 허용하는 것은 쉽고, 엔티티가 친구로 선언 된 엔티티가 아직 선언되지 않았다면, 주변 네임 스페이스의 구성원이 될 것입니다. 그러나 이것은 템플릿 매개 변수를 사용하려면해야한다는 것을 의미합니다 (예를 들어 클래스가 필요합니다).

friend class T;

그러나 그것은 추가적인 문제를 가져 왔고, 이익의 가치가 없었습니다. 이제이 논문은 추가 유형 지정자가 제공 할 수 있도록 제안합니다 (따라서 템플릿 매개 변수 및 typedef-names를 사용할 수 있습니다).

다음 C ++ 버전 (2010 년으로 인해)이이를 수행 할 수 있습니다.

표준에 대한이 업데이트 된 제안을 참조하십시오. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf . typedef 이름 만 허용하지 않고 템플릿 매개 변수도 친구로 선언 된 유형으로 사용됩니다.

다른 팁

Afaik, C ++ typedef는 클래스와 함께 사용될 때 본격적인 동의어를 만들지 않습니다. 다시 말해, 그것은 매크로와 다릅니다.

제한 중에는 클래스 나 구조 접두사 후에 동의어가 나타날 수 없거나 소멸자 또는 생성자 이름으로 사용될 수 없다는 것입니다. 또한 동의어를 서브 클래스 할 수 없습니다. 나는 그것이 당신이 그것을 친구가 할 수 없다는 것을 의미합니다.

VC ++ 8.0에서 코드를 시도했습니다.

...
class C
{
public:
  friend class A;       
  friend X;             
  friend B::SUPERCLASS; 
};
...

오류없이 컴파일됩니다.

나는 그것이 MS 특정 여부를 알지 못한다.

TypEdef는 유형을 정의합니다. 친구는 친구 수업이나 기능 (실질적으로 범위)을 선언 한 다음 선언 클래스의 비 공공 영역에 "액세스"를 갖는다 ...

프리미티브, 즉 플로트 또는 int* 코드 등의 범위를 정의하지 마십시오. 어쨌든 클래스를 "사용"하지 않습니다.

잊지 말고, 콜 컨벤션, 정렬 속성 및 기타 컴파일러 특정 항목, 즉 동일한 클래스에서 구현 된 다중 벡터 유형이지만 뚜렷한 정렬 속성을 갖는 다중 벡터 유형의 "팩"을 할 수 있습니다. => 유형은 클래스가 아니지만 그 반대도 마찬가지입니다.

IMHO, 친구 typedef가 유용 할 수 있지만, 어디서나 "클래스 타이핑"을 친구로 설정할 수있을 때 우정은 극도로 이해할 수 없어서 오류가 발생하기 쉬운 경우, 특히 템플릿이 과도하게 사용되는 경우 오류가 발생할 수 있습니다.

단일 Typedef를 무효화하면 광범위한 종속성으로 인해 전체 프로젝트가 엉망이 될 수 있습니다. 템플릿 친구와 0x 템플릿 typedefs는 유용하지만 친구 선언의 규칙을 완화하지 마십시오.

나는 친구 typedefs에 관한 제안을 모른다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top