Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Шаблоны С++

1.9K
20 декабря 2007 года
burst
94 / / 04.09.2006
Есть класс:

 
Код:
template <class T>
class Node{
    T *object;
public:
    Node();
    Node(T *);
    Node<T> * next;
    Node<T> * prev;
};


Код:
template <class T>
Node<T>::Node(){
    object = new T();
}

template <class T>
Node<T>::Node(T * node){
    object = new T();
    object = node;
    this->next = 0;
    this->prev = 0;
}


При вызове конструктора :

 
Код:
Session *session = new Session("PREDMET1",4);
    Node<Session> *node = new Node<Session>(session);


Вылетает ошибка
 
Код:
error LNK2001: unresolved external symbol "public: __thiscall Node<class Session>::Node<class Session>(class Session *)" (??0?$Node@VSession@@@@QAE@PAVSession@@@Z)
Debug/Stud_List.exe : fatal error LNK1120: 1 unresolved externals



Что то я не пойму, где ошибку сделал, вроде все правильно ...
6.6K
20 декабря 2007 года
Ordos
105 / / 02.11.2007
весь этот ко должен находиться в оном файле. Это так?
1.9K
20 декабря 2007 года
burst
94 / / 04.09.2006
Цитата: Ordos
весь этот ко должен находиться в оном файле. Это так?



нет, не так 0_о

6.6K
20 декабря 2007 года
Ordos
105 / / 02.11.2007
в смысле не совсем весь, а только описание шаблона.
1.9K
20 декабря 2007 года
burst
94 / / 04.09.2006
Подожди.. ты имеешь ввиду, что
Код:
template <class T>
class Node{
    T *object;
public:
    Node();
    Node(T *);
    Node<T> * next;
    Node<T> * prev;
};

template <class T>
Node<T>::Node(){
    object = new T();
}

template <class T>
Node<T>::Node(T * node){
    object = new T();
    object = node;
    this->next = 0;
    this->prev = 0;
}


то есть объявление класса и его реализация д.б. в 1 файле или еще что то ?
6.6K
20 декабря 2007 года
Ordos
105 / / 02.11.2007
Короче всё, что касается шаблона (описание шаблона и его реализация).
Обычные классы в С++ разделяют на хедер файл и спп файл.
С шаблонами так нельзя делать.
Шаблон целиком должен каходиться в одном файле.
1.9K
20 декабря 2007 года
burst
94 / / 04.09.2006
Спсибо, буду знать )
1.9K
20 декабря 2007 года
burst
94 / / 04.09.2006
еще такой момент:
Код:
template <class T>
class mList{
    Node<T> * root;
    Node<T> * curent;
public:
    mList<T> ();
    mList<T>(Node<T>*);
    void Add(Node<T> *n);
    void Delete(Node<T> *n);
    void DeleteRoot();
    void DeleteLast(Node<T> *n);
    void print();
};


Вызываю конструктор так:

 
Код:
typedef Node<Session> sesNode;
    Session *session = new Session("PREDMET1",4);
    sesNode *node = new sesNode(session);
    mList<sesNode> *list = new mList<sesNode>(node);


ошибка:

error C2664: '__thiscall mList<class Node<class Session> >::mList<class Node<class Session> >(class Node<class Node<class Session> > *)' : cannot convert parameter 1 from 'class Node<class Session> *' to 'class Node<class Node<class Session> > *'
505
21 декабря 2007 года
vAC
343 / / 28.02.2006
mList<Session> *list = new mList<Session>(node);
12K
21 декабря 2007 года
__AleXX__
133 / / 02.04.2007
На самом деле - фигня. Не обязательно в одном файле.

Чаще всего описывают шаблонный класс в .h файле, его реализацию в .hxx, а инстанциируют (о слово какое :) ) объекты в .cxx файлах.

Вот так вот.
1.9K
21 декабря 2007 года
burst
94 / / 04.09.2006
Цитата: vAC
mList<Session> *list = new mList<Session>(node);



Да, точно ))

505
21 декабря 2007 года
vAC
343 / / 28.02.2006
Цитата: Ordos
Короче всё, что касается шаблона (описание шаблона и его реализация).
Обычные классы в С++ разделяют на хедер файл и спп файл.
С шаблонами так нельзя делать.
Шаблон целиком должен каходиться в одном файле.



На самом деле, так можно делать при некоторых огранчениях:
Если в некотором .cpp есть обощенная реализация, то в этом же .cpp можно использовать любые шаблонные параметры.
Также можно делать специализацию шаблона.

В других же модулях можно использовать шаблон либо с теми же шаблонными параметрами, что использовались в первом .cpp, либо любую специализацию из него. Однако, в этом модуле можно определить любую другую специализацию и использовать ее в любом другом модуле (разумеется кроме .cpp, где сделана обобщенная реализация).

Все это следует из простой вещи: обобщенную реализацию нельзя скомпилировать.

505
21 декабря 2007 года
vAC
343 / / 28.02.2006
Думаю не будет оффтопом сказать, что шаблоны - очень гибкая конструкция. Им можно найти самые неожиданные применения. Например для бесопасного оперирования физическими величинами:
Код:
template<int M,int L,int T>
class Physical {
    double value_;
public:
    double value() { return value_; }
    Physical(double v) : value_(v) {}
    Physical(const Physical& rhs) : value_(rhs.value_) {}
};

template<int m1, int l1, int t1, int m2, int l2, int t2>
Physical<m1 + m2, l1 + l2, t1 + t2> operator*(Physical<m1, l1, t1> lhs, Physical<m2, l2, t2> rhs)
{
    return lhs.value() * rhs.value();
}

void main()
{
Physical<0,1,0>  length(2.0);   // 2[m]
Physical<0,0,-1> inv_time(0.1); // 0.1[1/sec] (10[sec])

    std::cout << (length*inv_time).value() << " [";
    std::cout << typeid(length*inv_time).name() << "]\n";
}

где параметры шаблона обозначают степени единиц измерения (масса, длина, время).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог