我试图编写一个通用容器(称为' 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?应该在构造函数中写什么?
谢谢!
答案 0 :(得分:1)
如果你想要的只是一个默认构造的容器,你根本不需要写任何东西;编译器会为你做这件事。
如果要将容器初始化为不同的容器,可以使用构造函数初始值设定项。例如,假设Container
有一个构造函数采用初始大小(如标准容器所有),那么你可以编写
template<class T, class Container>
tContainer_t<T, Container>::tContainer_t():
container(25) // make a container with 25 elements
{
}
请注意,在C ++中,与例如在Java中,成员变量container
是Container
类型的实际对象,而不仅仅是对它的引用。 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 {
将T
和Container
作为单独的独立模板参数。这不是我们在以下用法中看到的目标吗?
tContainer_t<int, vector<int*> > vContainer;
int
和int *
完全不同。