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> >)" (??$buble_sort@H@@YA?AV?$vector@HV?$allocator@H@std@@@std@@V01@@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