2012-01-21 4 views
1

먼저 좀 더 긴 샘플 코드와 질문에 사과드립니다 ... A, B, C의 세 클래스가 있습니다 (A와 B는 추상입니다).C++, 복사 생성자 구현, 기본 템플릿 매개 변수

클래스 A는 다른 유형의 Item을 저장하는 컨테이너를 나타냅니다.

파생 클래스 B에는 Item *에 대한 전문화가 포함되어 일부 기능이 추가되었으며 기본 매개 변수는 TD입니다.

typedef enum { D1, D2} TD; 

template < typename T, const TD td = D1 > 
class B; 

template <typename Item, const TD td> 
class B <Item *, td> : public A <Item *> 
{ 
    public: 
      B() : A <Item *>() {} 

    template <const TD td2> 
    B (const B <Item *, td2> & source) 
    { 
     if (this != &source) { //Code } //Error 
    } 

    virtual ~B() = 0 {} 
}; 

클래스 C는 추상 클래스가 아니며 추가 된 다른 기능 (코드에는 포함되지 않음)을 포함합니다.

template < typename T, const TD td = D1 > 
class C; 

template <typename Item, const TD td> 
class C <Item *, td> : public B <Item *, td> 
{ 
    public: 
      C() : B <Item *, td>() {} 

    template <const TD td2> 
    C (const C <Item*, td2 > &source) : B <Item*, td> (source) {}  
}; 

클래스 C의 두 개체를 만들려고하는 경우 기본 매개 변수가 형식 인 경우 모든 내용이 정상입니다.

Error 1 error C2446: '!=' : no conversion from 'const B<T,td> *' to 'B<T,td> *const 

내 질문 :

int main() 
{ 
C <Test <double> *, D1 > t1; 
C <Test <double> *, D1 > t2(t1); 
} 

그러나 두 매개 변수는 서로 다른 유형의 경우

int main() 
{ 
C <Test <double> *, D1 > t1; 
C <Test <double> *, D2 > t2(t1); 
} 

컴파일러가 선 다음 오류와

if (this != &source) { //Code } //Error 

에 정지

코드 :

1) 어디에서 (어떤 클래스에서) TD의 다른 지름에 대해 복사 생성자를 구현하는 방법.

2) 어디에서 (어떤 클래스에서) TD의 다른 지름에 대해 연산자 =를 구현하는 방법.

3) 소멸자를 구현하는 곳 (클래스)

도움 주셔서 대단히 감사합니다.

답변

1

문제는 다른 유형의 포인터를 비교할 수 없다는 것입니다. 어쨌든 유형이 다른 객체가 같지 않으므로 this != &source 행을 제거하고 td == td2 사례에 대해 다른 적절한 복사 생성자를 구현해야합니다.

template <const TD td2> 
B (const B<Item*, td2>& source) 
{ 
    // code 
} 

B (const B& source) 
{ 
    // code 
} 
+0

@ KennyTM :이 두 객체가 다른 유형이라는 사실을 잊었습니다. 당신의 도움을 주셔서 감사합니다. – justik

1

B < ..., D1> 및 B < ..., D2는> 완전히 다른 클래스를 사용하면 다른 하나에 하나를 복사 할 수 있습니다. 아마도 B < ..., D1> 개체를 B < ..l., D2> 개체에 복사하려면 템플릿 복사 기능을 작성해야합니다.