0

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

Код:

#include "Header.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;


void menu();

 int main()
  {
setlocale(LC_ALL, "Russian");
cout << ("Добро пожаловать в программу!") << endl;
menu();
 }


void menu()
 {
int n;
set <int> set1(max);
int x;
do {
    cout << '\n'
        << " ------------Menu------------ "
        << '\n' << ("1. Добавление эл-та в множество")
        << '\n' << ("2. Удаление эл-та из множества")
        << '\n' << ("3. Проверка вхождения эл-та в множество")
        << '\n' << ("0. Выход")
        << '\n' << "<";
    cin >> n;
    system("cls");
    switch (n)
    {

    case '1':cout << ("/add od");
        cin >> x;
            set1.add(x);
        break;
    case '2':cout << ("/del id)");
        cout << ("Введите величину эл-та");
        cin >> x;
            set1.del(x);
    case '3':cout << ("Выберете елемент для проверки");
        cout << ("Введите величину эл-та");
        cin >> x;
        if (set1.check_in(x))
            cout << ("Элемент содержится в данном множестве");
        else
            cout << ("Элемент не содержится в данном множестве");
        break;
    case '0':return;
    default:cout << ("Действие не выбрано");
    }
} while (true);
}

template <class T>
void set<T> ::add(T x)
 {
 if (size < max_size)
{
    if (!check_in(x))
    {
        a[size] = x;
        size += 1;
        cout << ("Добавление прошло успешно");
    }
    else
        cout << ("Добавление невозможно");
}
else
    cout << ("Добавление невозможно");
}


template <class T>
void set <T>::del(T x)
{
bool ok;
ok = false;
if (size != 0)
{
    for (int i = 0;i < size;i++)
    {
        if (a[i] == x)
        {
            for (int j = i;j < size;j++)
            {
                a[j] = a[j + 1];
            }
            size -= 1;
            ok = true;;
        }

    }
    if (ok)
        cout << ("Удаление прошло успешно");
}
else
    cout << ("Удаление невозможно");
}


template <class T>
bool set <T>::check_in(T x)
 {
for (int i = 0;i < size;i++)
    if (a[i] == x)
        return true;
return false;
}

Файл Header.h:

#pragma once
extern int max = 5;
template <class T>
class set
{
private:
T* a;
int max_size;
int size;
public:
//Конструкторы:
set(int maxim);
set(set <T>& x);

void add(T x);//добавление эл-та в мнохество
void del(T x);//удаление эл-та из множества
bool check_in(T x);//проверка вхождения эл-та в множество
};

Ошибка:введите сюда описание изображения

Прошу помочь с решением.

Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: __thiscall set<int>::set<int>(int)" (??0?$set@H@@QAE@H@Z) в функции "void __cdecl menu(void)" (?menu@@YAXXZ)

insolor
  • 49,104
  • Текст ошибки приводите, пожалуйста, текстом, а не скриншотом. – Kromster Mar 11 '20 at 05:55
  • Да потому что вы реализацию шаблонных функций поместили не ДО, а после их использования! Ну откуда компилятору знать, что генерировать? Это же ШАБЛОНЫ, а не обычные функции. Внимательно читайте, что написано в вопросе, дубликатом которого объявлен ваш. – Harry Mar 11 '20 at 05:56
  • понял, постараюсь исправить сам – Жека Миксик Mar 11 '20 at 05:57
  • @Harry Вообще-то текст шаблонов можно помещать после их использования, тут проблема в том, что ОП написал реализацию не для всех методов. – user7860670 Mar 11 '20 at 06:38
  • Если вы ещё здесь, можете решение подсказать, а то я сижу и сижу пробую пробую и ничего? что сделать то нужно? – Жека Миксик Mar 11 '20 at 07:15
  • @user7860670 Век живи - век учись... я привык, что шаблоны лучше в заголовочный файл вносить, и воспринял происшедшее как аналог ошибки вынесения реализации в .cpp-файл. – Harry Mar 11 '20 at 08:17

0 Answers0