2010-04-30 7 views

답변

8

예, 거기에 대한 내 자신의 문자열 유형에 대한 스왑을 전문으로하는 시도 swap<::string>이 작동하지 않는 것으로 나타났습니다 때

// approach 1 
namespace std 
{ 
    template<> 
    void swap<Foo>(Foo& x, Foo& y) // note the <Foo> 
    { 
     x.swap(y); 
    } 
} 

// approach 2 
namespace std 
{ 
    template<> 
    void swap(Foo& x, Foo& y) 
    { 
     x.swap(y); 
    } 
} 

나는이에 stumpled. 그러나 그 특별한 예에서는 아닙니다. 매개 변수가 도출되지 않으면, 당신은 <type>없이이 T 매개 변수 목록에서 무엇을 추론 할 수 없기 때문에 것을 전문으로 할 수없는 차이

template<typename T> void f(typename T::type t); 

을 만들 수 있습니다. 귀하의 경우 물론

struct MyType { typedef int type; }; 

// needs <MyType> 
template<> void f<MyType>(int t) { } 

, 그것은 당신의 문제를 일으키는 [ 같은 의미 년대 소리를 나타내는 두 글자 <:입니다. 이 문제를 방지하려면 <   ::string>과 같은 공백을 넣으십시오.

+0

+1 설명 주셔서 감사합니다! 그리고이 digraph 물건은 너무 재밌다 :) – fredoverflow

+0

실제로 그 문법이 표준에서 허용되는 것을 알 수 있습니까? 나는 그것을 지금 보지 못한다. –

+0

@ ff는 'f <..>'구문을 의미합니까? template-id는 id-expression으로 선언자 ID입니다. –

0

또한이 경우 전문화 할 필요가 없으며 과부하가 걸리고 행복 할 것입니다.

namespace std 
{ 
    void swap(Foo& x, Foo& y) 
    { 
     x.swap(y); 
    } 
} 
+0

당신이 정의되지 않은 동작을 좋아한다면, 그렇습니다 :) 당신은'std' 네임 스페이스에서 오버로드를 할 수 없습니다. – fredoverflow