2013-08-08 2 views
1

은 가정하자 나는, 나는만들기 특정 전문 분야

template<class T> 
void f(T t); 

template<class T> 
class X 
{ 
}; 

난 단지 f<T>X<T>의 친구가되고 싶은 경우

를 선언 한 :

template<class T> 
class X 
{ 
    friend void f<>(T t); 
}; 

이제 f가 다음과 같이 선언되었다고 가정 해보십시오.

template<class T, class U> 
void f(T t, U u); 

나는 다음과 같은 선언 할 : 모든 유형의 Uf<T, U>X<T>의 친구입니다. 그래서 f<int, char>X<int>의 친구가되고 싶지만, f<char, int>X<int>의 선물이되고 싶지 않습니다. 이것이 가능한가? 다음은 컴파일되지 않는 것 같습니다

template<class T> 
class X 
{ 
    template <class U> 
    friend void f<>(T t, U, u); 
}; 

전체 템플릿을 친구로 선언하는 방법을 알고 있습니다.

+0

일부 기능 템플릿 특수화가 필요합니다. 그리고 그것들은 허용되지 않기 때문에, 나는 이것이 가능하다는 것을 의심합니다. – jrok

+0

@jrok : 그건 지금까지 내 의혹입니다. 그러나 C++은 놀라움으로 가득합니다. 누군가가 올바른 구문을 만들거나 (표준에 의해) 그것이 불가능하다는 것을 증명하기를 희망합니다. –

답변

0

은 분명히 난 후 무엇을 할 수있는 현재 C의 방법 ++ 없다.

-2

[편집] 가능하다고 언급 한 website에서이 아이디어를 가져 왔지만 제대로 테스트하지 않았습니다. 결과적으로 이것은 작동하지 않으며 이므로이 제안을 무시하십시오.

는 지금까지 내가 말할 수있는, 어떤 영업 이익은하고 싶어 C에서 수 없습니다 ++ ... [/ 편집]

코드 당신이 부분적으로 함수 f를 전문 것이다 게시 된, 그러나이 아니다 허용. 그것을 해결하기 위해

는 친구 선언에서 빈 꺾쇠 괄호를 제거 :

template<class T> 
class X 
{ 
    template <class U> 
    friend void f(T t, U, u); 
}; 
+2

이 경우 네임 스페이스 범위에서 'f'선언을 얻는 유일한 방법은 일부 X를 인스턴스화하는 것입니다. OP가 원하는 것은 아닙니다. , 나는 믿는다. – jrok

+0

나는 잘 모르겠다. X의 템플릿 매개 변수에 따라 X의 친구가 될 수있는 f의 인스턴스화를 제한하려고합니다. 이것이 바로 이것이하는 일입니다. 물론 실제로 어떤 함수가 적용되는지를 알기 위해 X를 인스턴스화 할 필요가 있습니다. – dgel

+2

OP에서'f'는 이미 네임 스페이스 범위에서 선언되었습니다. 내가 알기에, 그들은 특정 전문 분야에만 국한되지 않고 단지 일부 분야와 만 친구가되고 싶어한다. 이제, 여러분이 어떤'X'를 인스턴스화 할 때 네임 스페이스 범위에서'f'의 또 다른 과부하가 발생합니다. 결과는 X를 어디에서 어떻게 인스턴스화하는지에 따라 조금 놀랄 수 있습니다. [http] : //coliru.stacked-crooked.com/view? id = 21f5a1042a9e66a5e482593a56c76215-f674c1a6d04c632b71a62362c0ccfc51). 이제'X x; '의 주석을 풀고 다시 시도하십시오. 출력이 다릅니다. – jrok