Błąd w programie

0

Po dłuższej przerwie od c++ wróciłem do niego, napisałem najprostsze sortowanie bąbelkowe i deklarację szablonu funkcji umieściłem w jednym pliku buble_sort.h a definicję w buble_sort.cpp

buble_sort.h

#pragma once
#include <vector>

template <typename T>
std::vector<T> buble_sort(std::vector<T> input);

buble_sort.cpp

#include "buble_sort.h"

template <typename T>
std::vector<T> buble_sort(std::vector<T> input)
{
    for (int i = 0; i<input.size(); i++)
    {
        for (int k = 0; k<input.size() - 1; k++)
        {
            if (input[k]>input[k + 1])
            {
                std::swap(input[k], input[k + 1]);
            }
        }
    }
    return input;
}

main.cpp

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

int main()
{
    std::vector<int> wek = { 5,6,8,6,4,1,2,7,9,4,5,6 };

    std::clog << wek.size()<<"\n";
    wek = buble_sort<int>(wek);
    for (int i = 0; i < wek.size(); i++)
    {
        std::clog << wek[i] << " ";
    }
}

i pojawiają mi się błędy (chyba linkera) nie wiem jak się ich pozbyć, błędy:

-Severity   Code    Description Project File    Line    Suppression State Error LNK1120 1 unresolved externals  agorytmy

-Severity   Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol "class std::vector<int,class std::allocator<int> > __cdecl buble_sort<int>(class std::vector<int,class std::allocator<int> >)" ([email protected]@@[email protected][email protected]@[email protected]@@[email protected]@[email protected]@Z) referenced in function _main   agorytmy    

Wiem kod banalny ale nie o nie pytam się o sposób działania - funkcja działa poprawnie tylko ten linker... Z góry dzięki za pomoc.

0

Rozwiązanie z tej strony zadziałało, ale dlaczego z szablonem funkcji trzeba postąpić w ten sposób a z "normalną" funkcją można zrobić tak jak ja to zrobiłem z sortowaniem i nie ma wtedy błędów?

2
przemyslowiec napisał(a):

Rozwiązanie z tej strony zadziałało, ale dlaczego z szablonem funkcji trzeba postąpić w ten sposób a z "normalną" funkcją można zrobić tak jak ja to zrobiłem z sortowaniem i nie ma wtedy błędów?

Zwykła funkcja zostanie skompilowana i znajdzie się w wynikowym pliku. Z szablonem jest inaczej, jeżeli nie jest używany nie zostanie rozwinięty. Podczas kompilacji pliku zawierającego definicję szablonu nie jest dostępna informacja o jego użyciu. Kompilator nie wie, że ma wygenerować funkcję dla szablonu przyjmującego typ int. Ponieważ szablon nie został rozwinięty dla typu int, to funkcja z odpowiednią sygnaturą nie znalazła się w skompilowanym pliku, co powoduje błąd podczas konsolidacji (trudno zlinkować się czymś, czego nie ma...).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0