• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z szablonem klasy "undefined reference to ...

Object Storage Arubacloud
0 głosów
636 wizyt
pytanie zadane 10 lipca 2019 w C i C++ przez Patrykosik88 Początkujący (340 p.)

Czołem programiści ! Mój problem : undefined reference to wektor<int>::wektor() 

Bawię się właśnie szablonami w c++ i gdy naprzykład dam wszystko do jednego pliku to program kompiluje się, ale gdy właśnie rozdziele go na pliki to wyskakuje ten błąd.

Kodzik:

main.cpp:

#include <iostream>
#include "vector.h"
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
    wektor <int> abc;
    while (true)
    {
    cout << "MENU" << endl;
    cout << "1. wyswietl liczby"<<endl;
    cout << "2. wstaw element do pocz¹tkowej vectora"<<endl;
    cout << "3. dodaj elemnt na koniec vectora"<<endl;
    cout << "4. ustaw element podajac indeks vectora"<<endl;
    cout << "5. pobierz vectora i go wyswietl"<<endl;
    cout << "wybor: "<<endl;
    char wybor=getch();
    switch(wybor)
    {
    case '1':
        {
          abc.wyswietl();
          break;
        }
    case '2' :
        {
          abc.wstaw();
          break;
        }
    case '3':
        {
            abc.dodaj();
            break;
        }
    case '4':
        {
            cout<<"Jaki index: ";
            int inuxior;
            cin>>inuxior;
            cout<<"Jaka wartosc: ";
            int wart;
            cin>>wart;
            abc.ustaw(inuxior,wart);
            break;
        }
    case '5':
        {
            cout<<"Podaj index vectora którego chcesz wyswietlic: ";
            int iglotex;
            cin>>iglotex;
            abc.pobierz(iglotex);
            break;
        }
    default :
        {
            abc.~wektor();
            exit(0);
        }
    }
    }
    return 0;
}

vector.h:

#include <iostream>
#include <vector>
using namespace std;

template <typename T> class wektor
{
private:
    vector<T> wiktor;
public:
    wektor();
    wektor(const wektor &biere);
    ~wektor();

  T pobierz(T indeks);
  T ustaw(T idx, T wartosc);
  T dodaj();
  T wstaw();
  T wyswietl();
};

vector.cpp:

#include <iostream>
#include "vector.h"
using namespace std;
template <typename T>wektor<T>::wektor()
{
    for(int i=0; i<=32; i++)
    {wiktor.push_back(0);}
}
template<typename T>T wektor<T>::pobierz(T indeks)
{
    cout<<"Indeks: ";
    cout<<indeks;
    cout<<" Wartosc: ";
    cout<<wiktor[indeks]<<endl;
}
template <typename T>T wektor<T>::ustaw(T idx,T wartosc)
{
    if(idx>wiktor.size())
    {
        cout<<"Odmowa dostepu vector nie jest tak duzy!"<<endl;
    }
    else {wiktor[idx]=wartosc;cout<<"Pomyslnie ustawiono wartosc do wektora "<<idx<<endl;}
}
template <typename T>T wektor<T>::dodaj()
{
    wiktor.push_back(0);
}
template <typename T>T wektor<T>::wstaw()
{
    wiktor.push_back(0);
    for(int j=1; j<=wiktor.size()-1; j++)
    {
    swap(wiktor[j],wiktor[j+1]);
    j=j+1;
    }
}
template <typename T>T wektor<T>::wyswietl()
{
    for(int i=1; i<=wiktor.size(); i++)
    {
        cout<<wiktor[i]<<endl;
    }
}
template <typename T>wektor<T>::~wektor()
{

    wiktor.clear();
    cout<<"DESTRUKCJA HEHEHEHHE"<<endl;
}

Prosiłbym o to, żeby ktoś wytłumaczył mi, dlaczego tak się dzieje, i dlaczego, gdy wrzuce wszystko do main.cpp zamiast dzielić to na pliki to wszystko jest ok. Dodałem szablony, ponieważ robie ćwiczenie z książki. Jak to naprawić ?

komentarz 10 lipca 2019 przez niezalogowany
for(int i=1; i<=wiktor.size(); i++) // ???
 {
     cout<<wiktor[i]<<endl;
 }
template<typename T>T wektor<T>::pobierz(T indeks) // dlaczego nie std::size_t?

W tym kodzie dzieją się złe rzeczy :D

2 odpowiedzi

0 głosów
odpowiedź 10 lipca 2019 przez j23 Mędrzec (194,920 p.)

Zawartość pliku vector.cpp przenieś do nagłówka.

komentarz 10 lipca 2019 przez Patrykosik88 Początkujący (340 p.)
Do nagłówka czyli ? Bo nie rozumiem
komentarz 10 lipca 2019 przez j23 Mędrzec (194,920 p.)

Na przykład do pliku vector.h. Chodzi o to, by kompilator w trakcie konkretyzacji z linii 8 widział pełną definicje szablonu. Teraz widzi tylko to, co masz w pliku vector.h - czyli definicję klasy wektor, ale bez definicji jej metod.

komentarz 10 lipca 2019 przez tkz Nałogowiec (42,000 p.)
komentarz 10 lipca 2019 przez Patrykosik88 Początkujący (340 p.)
Znalazłem dzięki za pomoc ;)
0 głosów
odpowiedź 10 lipca 2019 przez mokrowski Mędrzec (155,460 p.)

Na końcu pliku vector.cpp, dodaj:

template class wektor<int>;

https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl

komentarz 10 lipca 2019 przez Patrykosik88 Początkujący (340 p.)

Działa dzięki wielkie smiley

 

komentarz 11 lipca 2019 przez Munvik Dyskutant (9,350 p.)
Wiec temat zamknij

Podobne pytania

0 głosów
2 odpowiedzi 504 wizyt
0 głosów
2 odpowiedzi 407 wizyt
0 głosów
1 odpowiedź 279 wizyt
pytanie zadane 3 czerwca 2019 w C i C++ przez antek97 Nowicjusz (220 p.)

92,589 zapytań

141,440 odpowiedzi

319,697 komentarzy

61,974 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...