2014-02-25 3 views
3

이 질문은 C++ explicit template specialization of templated constructor of templated class과 중복 될 수 있습니다. 그러나 그 스레드에서 해결책을 찾지 못했습니다. 템플릿 기반 클래스의 템플릿 생성자에 대한 명시 적 템플릿 전문화

나는 템플릿 생성자와 템플릿 클래스가 있습니다
template<typename First, typename ... Rest> class var { 
    public: 
     template<typename T> var(T& t) { 
      std::cout << "general" << std::endl; 
     } 
}; 

그러나 경우에이 클래스, 즉 매개 변수 (같은 클래스의 객체 인스턴스화됩니다

, 우리는 저작권법과 전화하고 싶습니다를 (또는 move-) 생성자) 특정 작업을 수행해야합니다.

template<typename First, typename ... Rest> template<> 
var<First, Rest...>::var(var<First, Rest...>& v) { 
    std::cout << "copy" << std::endl; 
} 

이 때 g ++ 4.6이 컴파일하려고 내가 오류 얻을 : 그래서 나는 다음과 같은 시도하기 전에 잘못된 명시 적으로 전문화 '>'토큰 오류 : 둘러싸는 클래스 템플릿 명시 적으로 전문 이전 오류로 혼동하지 않습니다, 내가 생성자를 전문으로하고자하는 클래스 I는 문제를 볼

구제, 나는 ... 그러나 명시 적으로 말을

있을 것입니다, 나는 내가 원하는 것을 분명 해졌다 바랍니다. 어떤 아이디어?

template<typename First, typename ... Rest> class var { 
    public: 
    var() {}; 
    var(const var& v) { 
     std::cout << "copy" << std::endl; 
    } 
    template<typename T> 
    var(const T& t) { 
     std::cout << "general" << std::endl; 
    } 
}; 

int main() 
{ 
    var<int> i0; 
    var<int> i1(i0); 
    var<int> i2("Hello"); 
} 

copy 
general 

참고를 제공합니다 : 복사 생성자는 실패와 같은 비 복사 생성자를 전문으로하는 몇 가지 const를

귀하의 시도를 추가

답변

1

템플릿의 생성자 복사 생성자입니다.

12.8

:

A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6).

+0

질문에 표시된 문제에 대한 답변이 정상적으로 작동합니다. 그것은 나가 질문하고 싶었던 무슨을 확실히 질문하지 않았다 그래서 새로운 질문 있는다 : http://stackoverflow.com/questions/22024090/class-with-templated-constructor-as-well-as-copy-and -move-constructor – mg84

0

당신은 완전히 클래스를 전문으로하지 않고 템플릿 방법을 전문으로 할 수 없다. C++ 표준에서는 금지되어 있습니다.

그에 대한 일반적인 해결 방법은 Dieter Lücking이 대답 한대로 함수/메소드 오버로드입니다.

Also answered here

관련 문제