初始化通用模板化容器

时间:2014-04-03 21:35:58

标签: c++ templates constructor operator-overloading

我试图编写一个通用容器(称为' tcontainer_t'),它的内部实现可以使用向量或列表,以及T类型,根据用户&#39 ; s意志。当我在主要时,当我尝试创建一个“tcontainer_t”时会出现问题。 object - 如果容器类型是vector或list,则在运行时没有人知道。

//tcontainer_t.h

#include <vector>
#include <list>
using namespace std;

template <class T, class Container >
class tContainer_t {
private:
    Container container;
    typedef typename Container::iterator iter_t;
    iter_t it;

public:
    tContainer_t();
    tContainer_t<T, Container>(const tContainer_t<T, Container>& other);
    tContainer_t<T, Container>& operator=(const tContainer_t<T, Container>& classObj);
    virtual ~tContainer_t();

};

#endif /* TCONTAINERT_H_ */

cpp文件是:

 // tContainert.cpp

#include "tContainer_t.h"

//  default constructor
template < class T, class Container >
tContainer_t<T, Container>::tContainer_t() {

    this->container = new Container;   //C2679 binary '=' no operator found which takes...

}

//   copy constructor
template < class T, class Container >
tContainer_t<T, Container>::tContainer_t(const tContainer_t<T, Container>& other) {


}

//operator "="
template < class T, class Container >
tContainer_t<T, Container>& tContainer_t<T, Container>::operator=(const tContainer_t<T, Container>& classObj) {
    if (this != &classObj){
   }
    return *this;
}


template < class T, class Container >
tContainer_t<T, Container>::~tContainer_t() {
    // TODO Auto-generated destructor stub
}

主要是:

    int main() {

    tContainer_t<int, vector<int*> > vContainer;

    return 0;
}

请忽略析构函数和运算符&#34; =&#34; - 两者都存在,我删除了代码以澄清我的问题。 编译错误在此行弹出:

this->container = new Container;  

我知道这不是正确的做法。

但是如何使用它实例化vector或list?应该在构造函数中写什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果你想要的只是一个默认构造的容器,你根本不需要写任何东西;编译器会为你做这件事。

如果要将容器初始化为不同的容器,可以使用构造函数初始值设定项。例如,假设Container有一个构造函数采用初始大小(如标准容器所有),那么你可以编写

template<class T, class Container>
 tContainer_t<T, Container>::tContainer_t():
  container(25) // make a container with 25 elements
{
}

请注意,在C ++中,与例如在Java中,成员变量containerContainer类型的实际对象,而不仅仅是对它的引用。 new Container在堆上创建了一个并返回指针。所以你要做的是将Container的指针分配给Container,这会失败,因为Container没有构造函数指向Container

请注意,如果您要取消引用new返回的指针,它将进行编译(假设Container是可复制的,对于标准容器来说只是意味着包含的类型是),但仍然没有做什么你打算:它会在堆上创建一个Container对象,将它分配给container成员(这意味着将所有内容复制到对象container),然后你由于new返回的指针是临时的,没有分配,特别是没有删除,因此会留下内存泄漏。

答案 1 :(得分:1)

首先,我不得不指出以下几点。

  

Scott Meyers,Effective STL

     

第2项:注意与容器无关的代码的错觉

     

STL基于概括。数组被推广到   容器并根据它们包含的对象类型进行参数化。   函数被推广到算法中并参数化   他们使用的迭代器类型。指针被泛化为迭代器   并根据它们指向的对象类型进行参数化。

     

这只是一个开始。各种容器类型是一般化的   序列和关联容器,以及类似的容器   给出类似的功能。标准的连续内存容器   (参见第1项)提供随机访问迭代器,而基于标准节点   容器(再次参见第1项)提供双向迭代器。   序列容器支持push_front和/或push_back   关联容器没有。关联容器提供   logarithmic-time lower_bound,upper_bound和equal_range成员   函数,但序列容器没有。

     

http://my.safaribooksonline.com/book/programming/cplusplus/9780321545183/containers/ch01lev1sec2

课程模板

template <class T, class Container >
class tContainer_t {

TContainer作为单独的独立模板参数。这不是我们在以下用法中看到的目标吗?

tContainer_t<int, vector<int*> > vContainer;

intint *完全不同。