Sar Kerson Ответов: 2

Я столкнулся со странной проблемой при создании класса связанного списка .


-------------------------------------- Вот мои коды----------------------------------------
#ifndef _LIST_H_
#define _LIST_H_
template <typename t="">
struct Num {
    T num;
    Num *next;
};
template <typename t="">
class List {
private:
    Num<t>* pHead;
public:
    List();
    int count();
    void create(T *a, int n);
    void list_();
    void add(T key, int n);
    void Swapat(int a, int b);
    void Swapnum(T num1, T num2);
    int& at(int n);
    void Sort();
    void del(int n);
    void delTheSame();

};
#endif


------------------- И некоторые из функций-членов следующие:-----------------------
template <typename t="">
List<t>::List() {
    pHead = NULL;
}
template <typename t="">
void List<t>::create(T *a, int n) {
    Num<t> *pTail = NULL;
    for (int i = 0; i < n; ++i) {
        Num<t> *t = new Num<t>;
        t->num = a[i];
        t->next = NULL;
        if (pHead == NULL) {
            pHead = t;
            pTail = pHead;
        }
        else {
            pTail->next = t;
            pTail = t;
        }
    }
}
template <typename t="">
void List<t>::list_() {
    Num<t> *t = pHead;
    while (t != NULL) {
        cout << t->num << " ";
        t = t->next;
    }
    cout << endl;
}

---------------------------------- Но, проблемы пришли-------------------------------------------
Severity Code Description Project File Line
Error LNK1120 3 unresolved externals Test C:\Users\Sar.Kerson\Desktop\Test1\Test\Debug\Test.exe 1
Severity Code Description Project File Line
Error LNK2019 unresolved external symbol "public: __thiscall List::List(void)" (??0?$List@H@@QAE@XZ) referenced in function main Test C:\Users\Sar.Kerson\Desktop\Test1\Test\Test\main.obj 1
Severity Code Description Project File Line
Error LNK2019 unresolved external symbol "public: void __thiscall List::create(int *,int)" (?create@?$List@H@@QAEXPAHH@Z) referenced in function _main Test C:\Users\Sar.Kerson\Desktop\Test1\Test\Test\main.obj 1
Severity Code Description Project File Line
Error LNK2019 unresolved external symbol "public: void __thiscall List::list(void)" (?list_@?$List@H@@QAEXXZ) referenced in function _main Test C:\Users\Sar.Kerson\Desktop\Test1\Test\Test\main.obj 1

-------------------------------------Пожалуйста помочь-----------------------------------------------

Что я уже пробовал:

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

Philippe Mori

Даже если ваш вопрос действителен и может стоить 4 балла, потому что он неправильно отформатирован, он не будет стоить намного больше 2 баллов.

2 Ответов

Рейтинг:
14

Philippe Mori

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

Вот как работает шаблон в C++. Если вы хотите понять, почему, то прочитайте соответствующую документацию.

Чтобы сделать его простым, по существу, определение шаблона должно быть видно в текущем блоке компиляции (то есть файле CPP при компиляции), чтобы его можно было расширить. Это в чем-то похоже на макрорасширение.

ODR (One definition rule) указывает, что каждое определение, видимое различными единицами компиляции, должно совпадать...

Если вы посмотрите на некоторые стандартные заголовки, такие как <vector>, вы увидите, что большая часть кода шаблона находится в заголовочных файлах.


Sar Kerson

О, благодаря вашему предложению, я сделал это сегодня утром. Я избавился от стойки шаблона, затем объединил определение класса и определение функций-членов вместе, и это работает!

Рейтинг:
11

Sar Kerson

Мне очень жаль, но я не знаю, почему он не может полностью показать мои коды.
каждая функция-член выглядит следующим образом:
шаблон " typename T"
Список"Т":: Список() {
.............
}


Philippe Mori

Используйте блок кода при форматировании кода. Над редактором есть панель инструментов, и когда вы вставляете что-то в Редактор, он спрашивает вас, какой формат использовать с предварительным просмотром. Легче и быть не могло. Если что-то пойдет не так, то используйте кнопку улучшить решение и исправьте любую ошибку или неправильное форматирование.

Sar Kerson

Огромное спасибо. Я пробовал это несколько раз и понял, как это делается.