Szablon klasy, funkcji, przestrzeń nazw

0

Cześć Wszystkim,
chciałbym napisać coś w stylu std::sort tylko z własnymi algorytmami sortowania (ale to nie jest istotne). W tym wypadku chcę sortować tablicę. Udało mi się napisać coś takiego:

#pragma once

template <typename Type>
class Algorithm
{
private:
public:
	virtual void abstract() = 0;
	static void insertion_sort(Type table[], size_t size);
};
#include "Algorithm.hpp"

template <typename Type>
static void Algorithm<Type>::insertion_sort(Type table[], size_t size)
{
	for (Type i = 1; i < size; ++i)
	{
		Type j = i;
		Type temp = table[j];
		while ((j > 0) && (table[j - 1] > temp))
		{
			table[j] = table[j - 1];
			j--;
		}
		table[j] = temp;
	}
}
#include "Algorithm.hpp"

int main()
{
	int tab[5] = { 1, 4, 8, 2, 9 };
	size_t size = 5;
	Algorithm<int>::insertion_sort(tab, size);
}

W tym podejściu mam błąd:

Error	2	error LNK1120: 1 unresolved externals	Ścieżka\Debug\InsertionSort.exe	InsertionSort
Error	1	error LNK2019: unresolved external symbol "public: static void __cdecl Algorithm<int>::insertion_sort(int * const,unsigned int)" (?insertion_sort@?$Algorithm@H@@SAXQAHI@Z) referenced in function _main	Ścieżka\InsertionSort\Main.obj	InsertionSort

Chciałbym żeby to wyglądało jak w wypadku std::sort bez podawania typu czyli np.:

alg::sort(Tutaj moja tablica by była);

Nie bardzo wiem jak do tego się zabrać. Czy to podejście jest dobre? Może po prostu zrobić przeciążoną funkcję w

namespace

? Ale chyba nie o to mi chodzi. Patrzyłem w implementację biblioteki algorithm, ale to trochę wyższa szkoła jazdy dla mnie... Z góry dzięki za odpowiedzi!

1

Szablony to jak sama nazwa wskazuje tylko szablony. Więc kiedy używasz swojej klasy Algorithm w taki sposób:
Algorithm<int>::insertion_sort(tab, size);
Kompilator musi zinstancjonować (instantiate) klasę algorithm dla parametru szablonu int. W twoim przypadku nie może jednak tego zrobić, bo nie zna jej definicji, więc tego nie robi (ma jedynie deklarację dla Algorithm<int> !). Potem linker nie może znaleźć odpowiedniej funkcji.
Definicja szablonu musi być dołączona tam, gdzie chcesz z niego korzystać. Najlepiej jest załączyć ją w pliku hpp w twoim przypadku.
Można też zostawić podział na hpp i cpp tylko na końcu pliku hpp musisz zaincludować ten plik cpp.

  • w aktualnym stanie rzeczy nie możesz zrobić tak jak std::sort, bo dla klas nie jest (może się to zmieni w c++0y) dedukowany parametr(y) szablonu. Zamiast robienia szablonu dla klasy Algorithm zszablonuj tą statyczną metodę. Wtedy będziesz mógł wywoływać bez podawania <int>
0
template <typename Type>
void Algorithm<Type>::insertion_sort(Type table[], size_t size)    // static tylko w deklaracji

i kod szablonowy musisz wsadzić do pliku nagłówkowego.

Chciałbym żeby to wyglądało jak w wypadku std::sort bez podawania typu czyli np.:
W przypadku klas szablonowych musisz podać typ, jak nie chcesz podać typu to zrób funkcję szablonową.

0
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;

namespace Algorithm {
	template <typename Type>
	static void insertion_sort(Type table[], size_t size)
	{
    	for (Type i = 1; i < size; ++i)
	    {
	        Type j = i;
	        Type temp = table[j];
	        while ((j > 0) && (table[j - 1] > temp))
	        {
	            table[j] = table[j - 1];
	            j--;
	        }
	        table[j] = temp;
	    }	
	}
}

int main() {
	int tab[] = { 3, 2, 1 };
	Algorithm::insertion_sort(tab, 3);
	copy(tab, tab+3, ostream_iterator<int>(cout, "\n"));
	return 0;
}

[Solved]

2

Zastanów się co zrobi twój wzorzec:

template <typename Type>
static void Algorithm<Type>::insertion_sort(Type table[], size_t size)
{
    for (Type i = 1; i < size; ++i)
    {
        Type j = i;
        Type temp = table[j];
        while ((j > 0) && (table[j - 1] > temp))
        {
            table[j] = table[j - 1];
            j--;
        }
        table[j] = temp;
    }
}

dla: Algorithm<string>::insertion_sort(tab,size);

3

W ogole ten algorytm ma malo sensu, a pomysl przepisywania std na tym etapie jeszcze mniej.

1

Dobra, dzięki za odpowiedzi i podpowiedzi @_13th_Dragon @Sopelek @twonek . Okazuje się, że trzeba być bardziej bystrym

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