Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при компиляции. Шаблон, C:\Users\Alega\Documents\cod 
:(
    Опции темы
wowka19
Дата 27.1.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Не пойму что значит эта ошибка и почему она выскакивает:

obj\Debug\main.o||In function `main':|
C:\....\main.cpp|8|undefined reference to `Node<int>::Node()'|
C:\....\main.cpp|10|undefined reference to `Node<int>::~Node()'|
||=== Build finished: 2 errors, 0 warnings ===|

Вот собсно код:

main.cpp
Код

#include <iostream>
#include "node.h"

using namespace std;

int main()
{
    Node<int> a;

    return 0;
}



node.h
Код

#ifndef NODE_H
#define NODE_H

#include "item.h"

template <typename T>
class Node {
    private:
    T * prevNode;
    T * nextNode;
    void init();

    public:
    Node();
    ~Node();

    static T * head;
    static T * tail;
};

#endif // NODE_H


node.cpp
Код

#include "node.h"
template <typename T>
T * Node<T>::head = 0;

template <typename T>
T * Node<T>::tail = 0;

template <typename T>
void Node<T>::init() {
    if (head == 0) {
        head = this;
        prevNode = 0;
    } else {
        tail->nextNode = this;
        prevNode = tail;
    }
    tail = this;
    nextNode = 0;
}

template <typename T>
Node<T>::Node() {
    init();
}

template <typename T>
Node<T>::~Node() {
    if (prevNode == 0) {
        head = nextNode;
    } else {
        prevNode->nextNode = nextNode;
    }

    if (nextNode == 0) {
        tail = prevNode;
    } else {
        nextNode->prevNode = prevNode;
    }
}

PM MAIL   Вверх
586
Дата 27.1.2012, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Добавь в node.cpp:
Код
template class Node<int>;

PM   Вверх
wowka19
Дата 27.1.2012, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



не помогает...
если у тебя работает - покажи код полностью.
PM MAIL   Вверх
586
Дата 27.1.2012, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Там у тебя ещё были другие синтаксические ошибки...
Код
#include <iostream>
#include "node.h"

using namespace std;

int main()
{
    Node<int> a;
    return 0;
}

Код
#include "node.h"
template <typename T>
Node<T> * Node<T>::head = 0;

template <typename T>
Node<T> * Node<T>::tail = 0;

template <typename T>
void Node<T>::init() {
    if (head == 0) {
        head = this;
        prevNode = 0;
    } else {
        tail->nextNode = this;
        prevNode = tail;
    }
    tail = this;
    nextNode = 0;
}
template <typename T>
Node<T>::Node() {
    init();
}
template <typename T>
Node<T>::~Node() {
    if (prevNode == 0) {
        head = nextNode;
    } else {
        prevNode->nextNode = nextNode;
    }
    if (nextNode == 0) {
        tail = prevNode;
    } else {
        nextNode->prevNode = prevNode;
    }
}

template class Node<int>;


Код
#ifndef NODE_H
#define NODE_H
//#include "item.h"
template <typename T>
class Node {
private:
    Node<T> * prevNode;
    Node<T> * nextNode;
    void init();

public:
    Node();
    ~Node();
    static Node<T> * head;
    static Node<T> * tail;
};
#endif // NODE_H


Добавлено через 11 минут и 37 секунд
Строка "template class Node<int>;" нужна, когда пытаются писать код шаблонного класса с CPP-файле. Обычно же, описание шаблонного класса и код пишут в H-файле, а в CPP-файле не пишут.
Лучше перенеси код в H-файл:
Код
#ifndef NODE_H
#define NODE_H
//#include "item.h"
template <typename T>
class Node {
private:
    Node<T> * prevNode;
    Node<T> * nextNode;
    void init()
    {
            if (head == 0) {
            head = this;
            prevNode = 0;
        } else {
            tail->nextNode = this;
            prevNode = tail;
        }
        tail = this;
        nextNode = 0;
    }
public:
    Node()
    {
        init();
    }
    ~Node()
    {
        if (prevNode == 0) {
            head = nextNode;
        } else {
            prevNode->nextNode = nextNode;
        }
        if (nextNode == 0) {
            tail = prevNode;
        } else {
            nextNode->prevNode = prevNode;
        }
    }
    static Node<T> * head;
    static Node<T> * tail;
};

template <typename T>
Node<T> * Node<T>::head = 0;
template <typename T>
Node<T> * Node<T>::tail = 0;
#endif // NODE_H

PM   Вверх
wowka19
Дата 27.1.2012, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



спасибо. но покажи ПОЖАЛУЙСТА код, где файлы как у меня организованы. То есть реализация отдельна.

И объясни почему шаблоны описывают в одном H файле. Зачем? ведь на все смысл есть.
PM MAIL   Вверх
586
Дата 27.1.2012, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(wowka19 @  27.1.2012,  04:12 Найти цитируемый пост)
спасибо. но покажи ПОЖАЛУЙСТА код, где файлы как у меня организованы. То есть реализация отдельна.

Я их и показал:
Первый код - main.cpp
Второй код - node.cpp
Третий код - node.h

Цитата(wowka19 @  27.1.2012,  04:12 Найти цитируемый пост)
почему шаблоны описывают в одном H файле.

Чтобы для всех CPP-файлов, куда подключается node.h, была доступна реализация кода. Когда, например, объявляется класс Node<int> и Node<char>, то для этих классов компилятор генерит разный машинной код. А чтобы компилятор мог его сгенерить, должна быть доступна реализация кода.
PM   Вверх
wowka19
Дата 27.1.2012, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Подожди... как это
Код

Node<T> * prevNode;
Node<T> * nextNode;
........
static Node<T> * head;
static Node<T> * tail;

?

Мне же нужно чтоб в этих свойствах хранились объекты любого класса. То есть тип этих указателей должен быть T.


В общем видать я запутался.

Может ты покажешь как надо организовать связный список (пусть односвязный) при помощи шаблонов?
Чтоб потом при помощи этого шаблона-класса можно было организовать список любого класса.
PM MAIL   Вверх
wowka19
Дата 27.1.2012, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



---------------------------------------------------------------------------------
А можно ли так делать:
Код

template <typename T>
class T {
.........
};

?
PM MAIL   Вверх
borisbn
Дата 27.1.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(wowka19 @  27.1.2012,  03:41 Найти цитируемый пост)
Может ты покажешь как надо организовать связный список (пусть односвязный) при помощи шаблонов?Чтоб потом при помощи этого шаблона-класса можно было организовать список любого класса.


http://www.sgi.com/tech/stl/stl_list.h
Цитата(wowka19 @  27.1.2012,  04:03 Найти цитируемый пост)
А можно ли так делать:

а ты проверь


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 27.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(wowka19 @  27.1.2012,  02:41 Найти цитируемый пост)
Мне же нужно чтоб в этих свойствах хранились объекты любого класса.

одного любого, или любых нескольких ?



--------------------
PM MAIL WWW   Вверх
bsa
Дата 27.1.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(wowka19 @  27.1.2012,  05:03 Найти цитируемый пост)
А можно ли так делать:

можно. Обычно, так и делают.

Короче, запомни, объявление и реализация шаблона должны быть доступны во всех модулях, где шаблон используется. Если ты объявление и реализацию поместишь в один хидер (главное, не забудь указывать inline для всех методов), это правило будет выполнено.
Цитата(wowka19 @  27.1.2012,  04:41 Найти цитируемый пост)
static Node<T> * head;
static Node<T> * tail;
Зачем это вообще? Ты что делаешь список или один контейнер на всю программу?
Смотри, чтобы сделать контейнер "двусвязный список" необходимо начать именно с него:
Код
template<class T>
class MyList
{
};
Теперь нужно сделать класс "элемент списка" и два указателя - на начальный и конечный:
Код
template<class T>
class MyList
{
public:
private:
   struct Node;
   Node *first_;
   Node *last_;
};

template<class T>
struct MyList::Node
{
    Node(const T &value, Node *p = 0, Node *n = 0);
    ~Node();

    T data;
    Node *prev;
    Node *next;
};

template<class T>
MyList<T>::Node::Node(const T &value, Node *p, Node *n)
   : data(value)
   , prev(p)
   , next(n)
{
   if (n)
      n->prev = this;
   if (p)
      p->next = this;
}

template<class T>
MyList<T>::Node::~Node() {
   if (next)
      next->prev = prev;
   if (prev)
      prev->next = next;
}
Ну а теперь можно делать классу MyList методы добавления, удаления, итерации и пр. 
PM   Вверх
borisbn
Дата 27.1.2012, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  27.1.2012,  10:21 Найти цитируемый пост)

А можно ли так делать:
template <typename T>
class T {
.........
};

можно. Обычно, так и делают.

bsa, Вы не ошиблись  smile  ?
http://liveworkspace.org/code/c09bdc38197e...616db8f9674e562


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 27.1.2012, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ой.
что-то я не сообразил, что шаблонный параметр является названием класса. Мне такое и в голову не могло придти. гы. гы.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.