2009-08-25 4 views
1

간체 버전 :이것을 typedef하는 방법이 있습니까? 코드의

Foo.h :

class Foo { 
    private: 
     class Bar { 
      // ... 
     }; 
     typedef std::map<int, Bar> mapType; 
     mapType _map; 
    public: 
     void method(mapType::iterator it); 
}; 

foo.cpp의는 :

void Foo::method(mapType::iterator it) { 
    // ... 
    notMethod(it); 
} 

void notMethod(mapType::iterator it) { 
    // ... 
} 

은 당연히, 나는 notMethod의 정의에서 VS2008에서 오류 'mapType' is not a class or namespace name를 얻을. std::map<int, Bar>을 입력 할 필요가 없도록 notMethod의 정의에 notMethod을 입력하지 않아도되는 (우아한) 방법이 있습니까?

답변

21

사용

void notMethod(Foo::mapType::iterator it) { 
    // ... 
} 

Foo의 클래스 선언의 공개 섹션의 형식 정의를 넣어.

편집 : 이러한 문제가 발생하지 않도록하려면

, 당신은

  1. notMethod 친구 (단단 의해 제안) 할 수 있습니다,
  2. 사용 SBI의 템플릿 솔루션, 또는
  3. notMethodFoo의 개인 정적 멤버 함수 (무료 비회원 함수 인 것처럼 정확히 동일한 코드를 생성 함).

가장 적합한 솔루션은 실제로 notMethod에 달려 있습니다. notMethodBarBar 정말에만 Foo의 맥락에서 의미가 사용하는 경우의 내부

은의 내부 구현이 Foo의 일부이기 때문에, 나는 notMethod 개인 정적 멤버 함수를 만들 것 '.

notMethod 경우 첫 번째 인자 (이 Foo의 구성원이 될 수 없음을 의미)와 같은 비 Foo을해야하는 운전자, 그리고 내가 Bar 개인 유지하기를 원한다면, 나는 운영자 A를 만들 것 친구.

notMethod이 반복자에서 일반 연산을 구현하는 경우이를 템플릿 함수로 만들 것입니다.

Foo 님의 고객에게 유용한 클래스 인 경우 Bar 및 typedef를 공개하고 제가 제안한 해결책을 사용합니다.

+0

그래,이 작품은 ... public typedef가 어느 정도 클래스 바를 공개하지는 않습니까? – suszterpatt

+0

맞습니다. 귀하의 대안이 typedef를 대중에게 공개하는 것과 관련하여 토론 할 답변을 편집하겠습니다. –

+0

@suszterpatt : 당신이 진정으로 비 메소드 (예 :'notMethod()')가이 반복자 매개 변수를 취할 수있게하려면 논리적으로 * typedef를 노출시켜야합니다 (따라서'Bar'). "이전의"비 - 방법으로 그러한 매개 변수를 사용할 수 없도록하려면 Martin의 다른 대안 중 하나를 사용하십시오. 또 다른 대안으로, 당신은 모든 바 멤버를 비공개로 만들 수 있고, '푸'를 '바'의 친구로 선언 할 수 있습니다. –

5

Friends.

은 푸 클래스에

friend void notMethod(mapType::iterator it); 

를 추가하면 개인 내면의 클래스와 기능을 유지할 수 있습니다.

+0

이 경우 친구로 뭔가 선언하는 것이 과잉이라고 생각하지 않습니까? –

+3

아니요. 내부 전용 클래스를 공개하는 것보다 낫습니다. – DanDan

+2

원래 게시 한 것처럼 작동하지 않지만'mapType'을'notMethod'의 모든 곳에서'Foo :: mapType'으로 변경하면 작업을 시작하기 만하면됩니다. :) @orsogufo : 친구 기능이 과잉이라고 생각하는 이유는 무엇입니까? – suszterpatt

5

건물 마틴 B의 대답에 따라 : notMethod 나던 지도 타입이 클래스 내부 푸 때문에,이 경우 경우에 네임 스페이스로 클래스를 생각할 수있는 유형을 알고

이유 네가 원해.

void notMethod(Foo::mapType::iterator it) {} 

당신이 마틴 B에 동의하면

, 당신은 클래스의 공공 섹션에 형식 정의를 이동해야합니다

어느 쪽이든, 당신은 코드를 변경해야합니다. DanDan에 동의하면 Friend 기능을 사용해야합니다.

나 자신? 클래스 외부에 typedef를 넣고 클래스와 typedef를 모두 namespace에 넣습니다.

+0

'notMethod()'가 Foo 클래스 안에 있지 않습니다. – sbi

+1

맞습니다. typedef mapType은 method()와 notMethod()에서 Foo ::의 위치를 ​​비교하십시오. – Mizipzor

3

Martin B has provided you with an answer. 대체 방법은 다음과 같습니다.

notMethod()은 구현 세부 사항과 비슷합니다. 이는 cpp 파일의 이름없는 네임 스페이스에 정의되어있는 것 같습니다. 내가 보통이 경우에 할 것은 notMethod()에게 템플릿을 만드는 것입니다 다음 typedef 공개하는 피하거나 기능에게 친구를 만드는 것 외에도

template< typename It > 
void notMethod(It it) { 
    // ... 
} 

을,이 기능이 유용한 알고리즘을 제공한다, 추가 혜택이있다, 당신은 다른 반복자들과 함께 그것을 호출 할 수있다.

+0

흥미로운 트릭이 있습니다. :) – suszterpatt

관련 문제