0

내가 Boost.Serialization 사용하여 배 표현식 템플릿 팩을 직렬화하고있어 떠날 :템플릿 기능은 특정 유형을 매핑하고 다른 모든 변경

template <typename ... Args> 
std::string toBytes(Args... args) 
{ 
    std::ostringstream buf; 
    boost::archive::binary_oarchive arch(buf); 
    (arch << ... << args); 
    return buf.str(); 
} 

이것은 좋은 작동하지만을 나는 몇 가지 기본적인 포인터를 직렬화 할 때 유형 (말하자면, char*), 그것은 그것에 질식시킨다. Boost.Serialization이 이러한 유형을 의도적으로 직렬화하지 않는다는 것을 이해합니다. 그래서, 나는 그것을 직렬화하는 "기본"방법을 제공하고 싶다.

내가 CharPtrWrapperf 신원 기능으로 작동합니다 다른 유형을 반환 f(char*) 있도록 일부 기능 f을 통해 각 args 요소를지도 할 것을 달성하기 위해.

template<typename T> 
T f(T x) { return x; } 

template<> 
CharPtrWrapper f(char * x) { return CharPtrWrapper(x); } 

하지만이 코드는

오류 C2912을 제공합니다 :

내 방식이었다 명시 적 전문성 'CharPtrWrapper f를 (숯불 *)를'함수 템플릿

의 전문화 아니다

무엇이 문제이며 어떻게이 문제를 해결할 수 있습니까?

+5

전문화 과정은 주 템플릿 뒤에 있어야합니다. 어쨌든 오버로드를 대신 사용해보십시오. –

+0

'CharPtrWrapper f (char * x)'는'T f (T x)'와 완전히 일치하지 않습니까? – rustyx

답변

1

이 문제는 무엇이며이 문제를 어떻게 해결할 수 있습니까?

문제는 전문화가 전문 분야가 아니라는 것입니다.

template<typename T> 
T f(T x) { return x; } 

T를 입력 받아 동일한 타입을 반환하는 함수 서식 :

일반 f<>()

같이 정의된다. 따라서 f<>()의 특수화는 수신하는 것과 동일한 유형을 반환해야합니다. 이 char *를 수신 CharPtrWrapper을 반환하기 때문에

그러나

,

template<> 
CharPtrWrapper f(char * x); 

f<>()에 유효한 전문화 없습니다. f<>()에 대한

몇 유효 전문은 다음과 같습니다 n.m.에 의해 제안

template <> 
char const * f<char const *>(char const * x) { return x; } 

// or 

template <> 
char const * f(char const * x) { return x; } 

해결책은, 전문화 및 사용 대신에 과부하를 방지하는 것입니다.

CharPtrWrapper f(char * x) { return CharPtrWrapper(x); } 

또는 더 나은 아직, 대신 char *char const *가 나타납니다 즉, "template<>"부분을 삭제하고 간단하게 작성, 실용적인 관점에서 의미한다.

관련 문제