2014-04-03 4 views
0

Я пытаюсь создать общий контейнер (так называемый «tcontainer_t»), что его внутренняя реализация может использовать вектор или список, а тип T - по желанию пользователя. Проблема возникает, когда в основном, когда я пытаюсь создать объект «tcontainer_t» - никто не знает до времени выполнения, если тип контейнера является вектором или списком.Инициализировать шаблон шаблона с шаблоном

//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; 
} 

пожалуйста игнорируют деструктор и оператор "=" - и существуют, я устранил код прояснить мой вопрос , Ошибка компиляции появляется в этой строке:

this->container = new Container; 

И я знаю, что это не правильный способ сделать это.

но как я могу создать вектор или список, используя это? что должно быть написано в конструкторе?

Спасибо!

+2

Вы программист на Java, не так ли? – celtschk

+1

Серьезно, какова цель этого класса? Какую реальную проблему вы пытаетесь решить? – PaulMcKenzie

+0

Поверьте мне, я бы не придумал такой плохой дизайн. Это задание, которое мне нужно сделать. – jizanthapus

ответ

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), а затем вы останетесь с утечкой памяти, потому что указатель, возвращаемый new, является временным и нигде не назначается, и особенно не удаляется.

+0

Вы также должны указать, что он пытался присвоить вектор * вектору , поэтому ошибка компилятора. Знаешь, просто для того, чтобы прояснить, что он сделал неправильно :) –

+0

Я добавил текст об этом; спасибо за предложение. – celtschk

1

Прежде всего, я вынужден указать на следующее.

Скотт Мейерс Эффективное STL

Пункт 2: Остерегайтесь иллюзию контейнера-независимый код

The STL основан на обобщении. Массивы обобщаются на контейнеры и параметризуются на типы объектов, которые они содержат. Функции обобщаются на алгоритмы и параметрируются на типах итераторов , которые они используют. Указатели обобщаются на итераторы и параметризуются по типу объектов, на которые они указывают.

Это только начало. Индивидуальные типы контейнеров обобщаются в последовательные и ассоциативные контейнеры, а аналогичные контейнеры - , с аналогичной функциональностью. Стандартные контейнеры со сплошной памятью (см. Пункт 1) предлагают итераторы с произвольным доступом, в то время как стандартные контейнерные контейнеры (опять же, см. Пункт 1) предоставляют двунаправленные итераторы. Контейнеры последовательности поддерживают push_front и/или push_back, тогда как ассоциативных контейнеров нет. Ассоциативные контейнеры предлагают функции логарифмического времени 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 * совершенно различны.

Смежные вопросы