2010-12-04 3 views
4

여기에 몇 가지 관련 클래스가 있습니다. 하나는 수레 목록을 포함합니다. 하나는 단지 하나만 포함하고 있습니다. 가끔씩 나는 이것을 함께 번식시키고 싶다. 이 경우 목록이 아닌 목록을 '승격'하고 싶습니다. 여기에 내가 원하는 방식으로 작동하는 코드가 있습니다.내가 templatize 할 때 암시 적 변환이 일어나지 않습니다.

#define LIST_SZ 4 

class Vec1; 

class Vec1_list { 

    public: 
     Vec1_list() {} 
     Vec1_list(const Vec1& in); 

     float x[LIST_SZ]; 
}; 

class Vec1 { 

    public: 
     Vec1() {} 
     Vec1(const float& in); 

     float x; 
}; 

Vec1::Vec1(const float& in) { 
    x = in; 
} 

Vec1_list::Vec1_list(const Vec1& in) { 
    for (int i = 0; i < LIST_SZ; i++) { 
     x[i] = in.x; 
    } 
} 

Vec1_list operator*(const Vec1_list& a, const Vec1_list& b) { 
    Vec1_list tmp; 

    for (int i = 0; i < LIST_SZ; i++) { 
     tmp.x[i] = a.x[i]*b.x[i]; 
    } 

    return tmp; 
} 

int main(void) { 
    Vec1 v1; 
    Vec1_list v2, v3, answer; 

    answer = v1*v3; 
} 

하지만 지금은

#define LIST_SZ 4 

template <typename T> class Vec1; 

template <typename T> 
class Vec1_list { 

    public: 
     Vec1_list() {} 
     Vec1_list(const Vec1<T>& in); 

     T x[LIST_SZ]; 
}; 

template <typename T> 
class Vec1 { 

    public: 
     Vec1() {} 
     Vec1(const T& in); 

     T x; 
}; 

template <typename T> 
Vec1<T>::Vec1(const T& in) { 
    x = in; 
} 

template <typename T> 
Vec1_list<T>::Vec1_list(const Vec1<T>& in) { 
    for (int i = 0; i < LIST_SZ; i++) { 
     x[i] = in.x; 
    } 
} 

template <typename T> 
Vec1_list<T> operator*(const Vec1_list<T>& a, const Vec1_list<T>& b) { 
    Vec1_list<T> tmp; 

    for (int i = 0; i < LIST_SZ; i++) { 
     tmp.x[i] = a.x[i]*b.x[i]; 
    } 

    return tmp; 
} 

int main(void) { 
    Vec1<float> v1; 
    Vec1_list<float> v2, v3, answer; 

    answer = v1*v3; 
} 

'멀티 포트'

이 시간을 질식 컴파일러가 .... 내가 지금처럼을 템플리트하고 싶은 말은 -> Vec1_list - 자동으로 내 Vec1를 호출하지 않습니다 건설자. 이것은 C++에서의 삶의 사실인가요? 아니면 이것을 자동으로 수행 할 수있는 방법이 있습니까? 대안은 기능에서 큰 팬이 필요하다는 것입니다.

답변

1

Vec1_list이 인스턴스화되고 변환이 수행 될 때 인스턴스화되도록 Vec1_list 클래스의 친구로 operator*을 선언해야합니다.

편집 : 은 이렇게하려면 Vec1_list 클래스 템플릿 선언에 운영자 * 정의 이동하려면

friend static Vec1_list operator*(const Vec1_list& a, const Vec1_list& b){ 
    /* ... */ 
} 
0

나는 그것이 원하는 것으로 승격하지 않는 이유를 모른다. Vec1_list. 그것이 불가능하지만, 다음 하나는 항상이 작업을 수행 할 수 있습니다

template <typename T> 
Vec1_list<T> operator*(const Vec1<T>& a, const Vec1_list<T>& b) { 

    return Vec1_list<T>(a)*b;; 
} 

을 그건 그렇고, 난 여전히 원래의 문제를 파고 있어요.

1

변환 생성자를 통한 사용자 정의 변환은 템플릿 인수 차감으로 고려되지 않습니다.

템플릿 공제는 매개 변수화 된 형식을 과 동일하게 만드는 템플릿 템플릿 매개 변수를 인수 유형에으로 대체하려고 시도합니다. 그것이 불가능할 때, 그것은 허용됩니다 (저는 여기서 단순화합니다) : const/volatile 자격 수정 또는 '포인터를 기초로 유도 된'포인터 변환.

표준 [temp.deduct.call]의 14.8.2.1/3 절에 설명되어 있습니다.

관련 문제