2014-06-21 2 views
3

friend 함수가 다음과 같은 사용자 지정 반환 형식을 사용하지 않는 한 전역 네임 스페이스에서 클래스의 friend 함수를 만들고 싶습니다.사용자 지정 반환 형식을 사용하는 글로벌 네임 스페이스의 friend 함수

int 만약
typedef int Type; 

Type myFunction(); 

namespace foo { 

class Foo 
{ 
public: 
    friend Type ::myFunction(); 

private: 
    void bar() {} 
}; 

} 

Type myFunction() 
{ 
    foo::Foo a; 
    a.bar(); 
    return 0; 
} 

대신 코드를 컴파일 Type의 사용되지만, typedef와 컴파일러는 네임 스페이스의 유형을 구분하지 않는 것, 에러 제공 :

error: expected a class or namespace 
     friend Type ::myFunction(); 
      ^
error: C++ requires a type specifier for all declarations 
     friend Type ::myFunction(); 

나는 그 소리 ++ 500을 사용하고 있습니다를 . 2.79 on OS X. 예를 들어 typedef 대신 #define을 사용할 수 있지만 실제 문제는 변경할 수없는 다른 헤더 파일에서 사용자 지정 유형이 나옵니다. 도움이 될 것입니다.

+0

최소한 Ideone (GCC) (http://ideone.com/5wLR5y)에서 컴파일하십시오. 정말 [clang 특정 문제] (http://coliru.stacked-crooked.com/a/2d7ccf99e0ca5d1b) 인 것 같습니다. –

+0

gcc 4.9.2-6에서 나와 같은 문제가 발생했습니다. awesomeyi의 답변으로 해결되었습니다 .. 버그입니까? – frans

답변

5

이것은 GCC에서 작동하지만 VS13에서 또는 clang ++에서 말한 것처럼 작동하지 않습니다. 그러나이 문제가 VS13에서 수정되었습니다.

friend Type (::myFunction()); 
+0

감사합니다. clang ++에서도 작동합니다. – makuz