2015-01-03 5 views
0

나는 대략 다음과 같은 방법으로 이루어집니다 템플릿 벡터 클래스를 만드는 오전 : 메인 템플릿템플릿 전문화 일치하는 생성자

// Main class 
template <typename T, int DIMS> 
class Vector 
{ 
    // Default constructor 
    Vector(); 
    // Data constructor 
    Vector(const T data[DIMS]); 

    // Other functions, variables, operators 
}; 

// 3d specialization 
template <typename T> 
class Vector<T, 3> 
{ 
    // Cross product for 3d vectors -- only thing in specialization 
    static Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b); 
}; 

, 나는 기본 생성자뿐만 아니라 요소를 지정하는 생성자가 있습니다. 요소를 사용하여 생성자를 사용하여 컴파일하려고하면 no matching constructor for initialization of 'Vec3f' (aka 'Vector<float, 3>') 오류가 발생합니다.

내가 쳐다 보았던 비슷한 질문은 생성자가 템플릿 기반 클래스에서 자동으로 작동해야한다는 것을 나타냅니다. 그래서 여기에서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 이전에 템플릿 전문화가없는 클래스에 생성자 오류가 있었고 다른 생성자가 실행 가능하지 않다고 나와서 생성자가 어떤 이유로 템플릿 기반 클래스에 복사되지 않는다고 생각하게합니다.

+0

이 코드를 더 게시해야합니다. 어쨌든 기본 템플릿의 내용은 부분 전문화로 복사되지 않습니다. 그들은 완전히 무관하다. –

+0

생성자 코드와 특수화에 포함 된 모든 것을 추가했습니다. 다른 것을 포함시키는 것이 도움이된다면 알려주십시오. – danielunderwood

+0

@ T.C. 그렇다면 템플릿에서 생성자, 함수, 연산자 등 모든 선언 및 정의를 템플릿에서 특성화로 복사해야합니까? 그것은 템플릿의 목적을 무력화시키는 것이 아닌가? – danielunderwood

답변

0

부분 및 명시 적 전문화는 기본 템플릿에서 어떤 것도 상속하지 않습니다. 그들은 완전히 무관하다. 코드에서 Vector<T, 3>은 정적 멤버 함수를 제외한 완전히 비어있는 클래스입니다.

부분/명시 적 특수화가 기본 템플릿과 코드를 공유 할 때 (예 : 공유 기능을 구현하는 기본 클래스 템플릿에서 상속을 받음) 코드 중복을 줄이는 방법이 있지만이 경우에는 처음에는 부분 전문화를 작성하십시오. 그냥 cross에게 무료 함수 템플릿합니다

template <typename T, int DIMS> 
class Vector 
{ 
    // Default constructor 
    Vector(); 
    // Data constructor 
    Vector(const T data[DIMS]); 

    // Other functions, variables, operators 
}; 

template<typename T> 
Vector<T, 3> cross(const Vector<T, 3> a, const Vector<T, 3> b); 

보조 노트로를 Vector(const T data[DIMS]); 당신이 그것을가하는 생각을하지 않을 수 있습니다 - 그것은 Vector(const T *data); 정확히 동일합니다.

+0

그러면 문제가 해결됩니다. 다른 질문을 읽었을 때 템플리트 멤버가 전문화되어있는 것처럼 보였습니다. 귀하의 메모에 관해서, 나는 그것들이 동등하다는 것을 알고 있습니다; 나는 그 순간에 무엇이 전달되어야하는지 명확히하기 위해 그것을 가지고 있습니다. – danielunderwood