Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化Stl容器_C++_Templates - Fatal编程技术网

C++ 模板化Stl容器

C++ 模板化Stl容器,c++,templates,C++,Templates,如何通过删除指针内容释放容器项?g++不允许此代码 让我们看看: _容器从未声明过 删除*项需要分号 删除指针之前不需要测试它-可以删除0 您必须确保T是指针类型 不要像这样使用原始指针-最好使用一些好的智能指针 你没有 template <class T> class container { typedef list<T> ObjectList; public: ~container () { fo

如何通过删除指针内容释放容器项?g++不允许此代码

让我们看看:

_容器从未声明过

删除*项需要分号

删除指针之前不需要测试它-可以删除0

您必须确保T是指针类型

不要像这样使用原始指针-最好使用一些好的智能指针

你没有

    template <class T>
    class container
    {
        typedef list<T> ObjectList;
public:
    ~container ()
    {
        for (typename ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++)
        {
        if (*item) 
        delete (*item)
        }
    }
    }
成员容器自行管理其元素

但是,如果希望存储指向动态分配对象的指针,并让容器承担删除的所有权责任,则可以遍历列表并对每个元素调用delete。但是,您还需要考虑当这个容器对象被复制或分配给另一个容器对象时会发生什么!副本将共享相同的指针对象,某些元素可能会被删除两次


顺便说一句:您不应该使用以下划线开头的名称。这些名称是保留的。

您不想这样做-在您的情况下,容器ObjectList拥有它包含的项,因此要删除它们,您需要告诉它您想要什么,如:ObjectList.橡皮擦项;。由于您显然正在删除所有项目,因此最好使用:ObjectList.clear;并完全跳过使用显式循环

同样,由于ObjectList显然是一个std::list,您不需要执行上述任何操作—当您销毁std::list时,它会自动销毁它包含的任何对象

编辑:主要是为了回应UncleBens的评论:如果您试图创建一个指针容器来管理删除它包含的指针指向的项,那么您要做的第一件事就是确保它确实包含指针:

template<typename T>
class container {
    typedef list<T> list_t;
    list_t container_;
    // no user-defined destructor needed
};
有打字错误 您试图删除的不是指针 希望这对你有用


现在还不清楚您要实现什么,但是如果您试图创建一个存储指向对象的指针的容器,而不是存储对象本身,那么更好的方法是根据您的意图将智能指针的容器设置为特定类型的智能指针。这将自动处理对象生命周期管理。

停止尝试自己这样做,使用。

或者您可以使用boost ptr容器为您完成所有繁重的工作


邮递一些真实的代码。这里有一些简单的编译错误。请回复您的问题,如果您在修复了简单错误后仍然有一个问题。_Container,您在哪里定义了这个?我不明白。这段代码只是伪代码。我问的是不同的话题?为什么人们想表现得像一个编译器呢?g++不允许这样的代码大概是这样的,你有你试图编译的代码,但它不起作用。如果我们不知道代码是什么,我们就无法修复代码。伪代码可以工作,但需要编写良好。你所拥有的是不完整的和草率的。你问我们为什么表现得像一个编译器,也许是因为你问我们为什么编译器会给你错误?如果不是C++程序员,我们应该怎么处理它呢?我假设OP有点像BooST.pTrIB容器,尽管很难从问题中看出。有一个容器,删除包含指针是一个完美的犹太事物。必须走石头的道路,以天堂。被称为C++的岩石路径多次旅行。最好是沿着这条路走,不要偏离它。我同意你应该在这条路上迷路。被土匪打得几乎要死,然后把你做错的事和提振做比较。这样你就能学到新东西。但在你慢吞吞地离开之前,要明白这是一个已解决的问题。我认为容器可能是问题,但容器不是。不确定这是另一种方式:任何以两个下划线或一个下划线后跟大写字母开头的名称都是不应该使用的保留名称。请阅读以下内容了解命名限制:what-are-the-rules-about-use-an-下划线-in-a-c-identifier[隐式生成的复制符和赋值运算符如何?请阅读以下内容:\容器是为操作系统保留的。如果操作系统构建器决定将具有此名称的宏添加到标准头中,则会弄乱您的代码。在删除之前,您无需检查null。我只是想说明为什么他会面临编译错误,我我不想为他写整个设计
template <class T>
class container { 
    typedef typename std::list<T>::iterator it;
    std::list<T *> items;    // Note 'T *' rather than just "T"
public: 
    ~container() { 
        for (it p=items.begin; it!=items.end(); ++it)
             delete *it;     // *it yields a pointer from the container.      
    }    
};
template <class T>
class container
{

public:
    typedef list<T*> ObjectList;
    ~container ()
    {
        for (ObjectList::iterator item = _Container.begin(); item != _Container.end(); item++)
        {
            if (*item) 
                delete (*item);
        }
    }
    ObjectList _Container;
};