일반 컨테이너를 지우는 데 문제가 있습니다. 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;
}
감사합니다 ...
i_items 오류를 삭제하면 오류 C2440 (VS 2010)이 발생합니다. 위를 참조하십시오. 부스트가 마음에 들지 않습니다. 부스트가없는 솔루션을 선호합니다 .--) – Woody
@Woody : 잘못된 유형의 캐스트에서만 오류가 발생합니다. . 나는 여기에 어떤 타입 캐스팅도 보이지 않는다. 실제 코드를 게시 해주세요. 부스트없이, 나는 당신이 단순히 부스트 라이브러리를 다시 구현하는 것을 감안할 때 마음에 들지 않는 것을 이해하지 못한다 ... –
나는 그럴 생각 : 벡터- 유형 항목은 객체와 포인터를 모두 나타낼 수있다. = 개체 및 항목 = * 개체). 하지만 잘못된 가정입니다 ... –
Woody