2011-01-22 5 views
0

일반 컨테이너를 지우는 데 문제가 있습니다. clear() 함수를 수행함에있어 프로그램은 실패합니다.일반 컨테이너 삭제 중 예외, C++

기본 클래스 :

//Generic container 
template <class Item> 
struct TList 
{ 
    typedef std::vector <Item> Type; 
}; 

template <class Item> 
class GContainer 
{ 
protected: 
      typename TList <Item>::Type items; 

public: 
      GContainer() : items (0) {} 
    virtual ~GContainer() = 0; 

public: 
      typename TList <Item>::Type ::iterator begin() { return items.begin(); } 
      typename TList <Item>::Type ::iterator end() { return items.end(); } 
... 
}; 

파생 클래스 : 명확한 방법의

//Generic container for points 
template <class Point> 
class ContPoints : public GContainer <Point> 
{ 
public: 
    void clear(); 
      ... 
}; 

//Specialization 
template <class Point> 
class ContPoints <Point *> : public GContainer <Point> 
{ 
public: 
    void clear(); 
      ... 
}; 

구현() 놀랍게도

template <class Point> 
void ContPoints <Point *>::clear() 
{ 
     for (typename TItemsList <Point>::Type ::iterator i_items = items.begin(); i_items != items.end(); ++i_items) 
     { 
       //Delete each node 
       if (&(i_items) != NULL) 
       { 
          delete * i_items //Compile error, not usable, why ??? 
          delete &*i_items; //Usable, but exception 
        *i_items) = 0; //Than exception 
       } 
     } 
     items.clear(); //vector clear 
} 

:

A] 나는 할 수 없습니다입니다 * i_items을 (를) 삭제하려면 ... .

delete *i_items; //Error C2440: 'delete' : cannot convert from 'Point<T>' to 'void * 

B] 나는 ... 당신의 도움을

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ContPoints <Point<double> *> pll; 
    pll.push_back (new Point <double>(0,0)); 
    pll.push_back (new Point <double>(10,10)); 
    pll.clear(); //Exception 
    return 0; 
} 

감사합니다 ...

답변

3

delete &*i_items;delete *i_items;해야 만 & * i_items을 삭제할 수입니다. 당신은 포인터의 주소를 삭제하고 싶지 않다, 당신은 포인터를 삭제하고 싶다! 나는 다음 줄 (*i_items) = 0; //Exception)에 대한 이유를 전혀 보지 못했다.

마지막으로 포인터로 포인트를 삽입하는 이유는 무엇입니까? 실제 포인트를 삽입하고 대신 std::vector을 사용하십시오. 콘테이너가 자동으로 delete 인 콘테이너를 원하는 경우에, boost pointer containers를 고려하십시오.

+0

i_items 오류를 삭제하면 오류 C2440 (VS 2010)이 발생합니다. 위를 참조하십시오. 부스트가 마음에 들지 않습니다. 부스트가없는 솔루션을 선호합니다 .--) – Woody

+0

@Woody : 잘못된 유형의 캐스트에서만 오류가 발생합니다. . 나는 여기에 어떤 타입 캐스팅도 보이지 않는다. 실제 코드를 게시 해주세요. 부스트없이, 나는 당신이 단순히 부스트 라이브러리를 다시 구현하는 것을 감안할 때 마음에 들지 않는 것을 이해하지 못한다 ... –

+0

나는 그럴 생각 : 벡터 유형 항목은 객체와 포인터를 모두 나타낼 수있다. = 개체 및 항목 = * 개체). 하지만 잘못된 가정입니다 ... – Woody

0

는 제가

template <class Point> 
class ContPoints <Point *> : public GContainer <Point> 

GContainer에서 볼 수 있듯이 Point로하지 포인터 값 Point의 인스턴스를 저장한다.

이 메시지는 Point<T>을 포인터로 변환 할 수 없다는 오류 메시지로 확인되었습니다.

+0

즉, std :: vector 유형을 의미합니다. 항목은 포인터가 될 수 없습니까? – Woody

+0

'Point'라고 정의한 기본 클래스에서 상속 받았다. Type은'Point *'의 특수화가 아닌'std :: vector '이다. – Puppy

+0

나는 Item이 객체와 포인터를 모두 표현할 수 있다고 가정한다. 개체 및 항목 = * 개체) ... – Woody