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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] шаблоны 
V
    Опции темы
DeathKnight
Дата 20.9.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть шаблон односвязного списка:
Код

template<class T>
class List
{
    T val;
    bool l;
    List *next;
    public:
        List(): l(false), next(NULL)
        {}
        List(int &k): val(k), l(true), next(NULL)
        {}
        int size()const;
        bool empty()const;
        int get(int num);
        void add(T &);
        void add(T);
        void del(int num);
        ~List();
        int operator[](int i);
};


Код

#include "list.h"

template <class T>
bool List<T>::empty()const
{
    if(l)return true;
    else return false;
}

template <class T>
int List<T>::size()const
{
    if(l)
    {
        int i=1;
        List *p=next;
        while(p!=NULL)
        {
            i++;
            p=p->next;
        }
        return i;
    }
    else return 0;
}

template <class T>
void List<T>::add(T &k)
{
    if(!l)
    {
        val=k;
        l=true;
        return;
    }
    else
    {
        if(next!=NULL)
        {
            List *p=next;
            while(p->next!=NULL)
            {
                p=p->next;
            }
            p->next=new List(k);
        }
    }
}

template <class T>
void List<T>::add(T k)
{
    if(!l)
    {
        val=k;
        l=true;
        return;
    }
    else
    {
        if(next!=NULL)
        {
            List *p=next;
            while(p->next!=NULL)
            {
                p=p->next;
            }
            p->next=new List(k);
        }
        else
        {
            next=new List(k);
        }
    }
}


template <class T>
int List<T>::get(int k)
{
    List *p=this;
    for(int i=0; i < k; i++)
    {
        if(p->next==NULL) throw i;
        p=p->next;
    }
    return p->val;
}

template <class T>
List<T>::~List()
{
    if(next!=NULL) delete next;
}

template <class T>
int List<T>::operator [](int k)
{
    return get(k);
}

template <class T>
void List<T>::del(int k)
{
    
    List *p=this, *d;
    for(int i=0; i < k-1; i++)
    {
        if(p==NULL) throw i;
        p=p->next;
    }
    d=p->next;
    p->next=p->next->next;
    d->next=NULL;
    delete d;
}


и такой пример использования

Код

#include <cstdlib>
#include <iostream>
#include <string>
#include "list.h"

using namespace std;

int main(int argc, char *argv[])
{
    List<int> h;
    h.add(5);
    h.add(4);
    h.add(56);
    h.add(23);
    
    cout << h.get(1) << endl;
    cout << h.get(0) << endl;
    cout << h[0] << endl;
    cout << h[3] << endl;

    try
    {
        cout << h[80] << endl;
    }
    catch(int k)
    {
        cout << "mistake at " << k << endl;
    }

    h.del(2);
    try
    {
        cout << h.get(1) << endl;
        cout << h.get(0) << endl;
        cout << h[0] << endl;
        cout << h[3] << endl;
    }
    catch(int k)
    {
        cout << "mistake at " << k << endl;
    }
 
    system("PAUSE");
    return EXIT_SUCCESS;
}



так вот при компиляции линковщик выдает 
Код

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall List<int>::~List<int>(void)" (??1?$List@H@@QAE@XZ) referenced in function __catch$_main$0
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall List<int>::del(int)" (?del@?$List@H@@QAEXH@Z) referenced in function __catch$_main$0
1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall List<int>::operator[](int)" (??A?$List@H@@QAEHH@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall List<int>::get(int)" (?get@?$List@H@@QAEHH@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall List<int>::add(int)" (?add@?$List@H@@QAEXH@Z) referenced in function _main
1>C:\Documents and Settings\DeathKnight\Мои документы\Visual Studio 2008\Projects\laba 4\Debug\laba 4.exe : fatal error LNK1120: 5 unresolved externals



можете пояснить в чем дело?
PM   Вверх
zim22
Дата 20.9.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(DeathKnight @  20.9.2009,  15:22 Найти цитируемый пост)
можете пояснить в чем дело?

шаблон должен быть объявлен и определён в h-файле. cpp-файл использовать не нужно.


--------------------
PM MAIL   Вверх
ИванМ
Дата 20.9.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



можно export писать, тогда объявление в одном месте, определение в другом 
но тоже только для h-файлов
PM MAIL   Вверх
zim22
Дата 20.9.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(ИванМ @  20.9.2009,  16:26 Найти цитируемый пост)
можно export писать

написать можно. но есть ли в компиляторе поддержка раздельной модели компиляции кода шаблона - это уже другой вопрос.

Это сообщение отредактировал(а) zim22 - 20.9.2009, 17:07


--------------------
PM MAIL   Вверх
DeathKnight
Дата 20.9.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



благодарю
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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