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

Jawna konkretyzacja C++

Cloud VPS
0 głosów
1,967 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Evelek Nałogowiec (28,960 p.)
edycja 28 marca 2017 przez Evelek

Nie potrafię zrozumieć wiersza nr 7:

...
template <class T>
void Swap(T &, T &); //prototyp szablonu
template <> void Swap<job>(job &, job &); //jawna specjalizacja dla typu job
int main()
{
	template void Swap<char>(char &, char &); //jawna konkretyzacja dla typu char
	short a, b;
	...
	Swap(a, b); //niejawna konkretyzacja szablonu dla typu short
	job n, m;
	...
	Swap(n, m); //użycie jawnej specjalizacji dla typu job
	char g, h;
	...
	Swap(g, h); //uzycie jawnie skonkretyzowanego szablonu dla typu char
	...
}

Ten przykładowy kod został wzięty z książki. Niestety, nie kompiluje się we wskazanej przeze mnie linijce. Poprosiłbym o wytłumaczenie kogoś do czego służy taki szablon jawnej konkretyzacji. Rozumiem jego użycie w taki sposób:

cout << funkcja<int>(x, y) << endl; //jawne żądanie
//konkretyzacji szablonu z typem int,
//wartości x i y są w ramach wywołania funkcji rzutowane na typ int,
//a sama funkcja zwraca także wartość typu int

Ale nie rozumiem szablonu dla takiej jawnej konkretyzacji.

1 odpowiedź

+1 głos
odpowiedź 29 marca 2017 przez criss Mędrzec (172,570 p.)
wybrane 29 marca 2017 przez Evelek
 
Najlepsza

template void Swap<char>(char &, char &); Takie coś (jak to nazwałeś - konkretyzacja) jest po to, żeby kompilator utworzył podaną instancje template-a nawet jeśli nie będzie żadnego wywołania z argumentami tego typu. W taki sposób po prostu wymusza się utworzenie funkcji. Nie wiem tylko, czy może pojawić się w takim miejscu (wewnątrz funkcji) - raczej wątpie.

komentarz 29 marca 2017 przez Evelek Nałogowiec (28,960 p.)

A czy nie służy do tego jawna specjalizacja? Trochę beznadziejny ten kod:

#include <iostream>
using namespace std;

struct job {
	int liczba;
};

template <class T>
void Swap(T &a, T &b) { //prototyp szablonu
	cout << a << " " << b << endl;
}

template <> void Swap<job>(job &a, job &b) { //jawna specjalizacja dla typu job
	cout << a.liczba << " " << b.liczba << endl;
}

template void Swap<char>(char &a, char &b);  //jawna konkretyzacja dla typu char

int main()
{
	short a, b;
	Swap(a, b); //niejawna konkretyzacja szablonu dla typu short

	job n, m;
	Swap(n, m); //użycie jawnej specjalizacji dla typu job

	char g, h;
	Swap(g, h); //uzycie jawnie skonkretyzowanego szablonu dla typu char
}

Tworzona jest nowa instancja funkcji Swap dla typu char. Czy tak to ma działać? Ta jawna konkretyzacja nic takie "konkretnego" nie robi? Gdy próbuje utworzyć definicję takiej funkcji to ciągle mam błąd.

komentarz 29 marca 2017 przez criss Mędrzec (172,570 p.)

Konkretyzacja bo konkretyzuje parametr template-a. 

Specjalizacji możesz użyć gdy chcesz żeby dla jakiegoś typu funkcja/klasa odbiegala od schematu. Np. std::vector <bool> jest specjalizacją.

Gdy próbuje utworzyć definicję takiej funkcji to ciągle mam błąd

Bo juz jest zdefiniowana. Wymusiles tylko żeby kompilator do wynikowego programu wkompilowal instancje template funkcji gdzie T jest char-em. 

Podobne pytania

+1 głos
3 odpowiedzi 1,121 wizyt
0 głosów
1 odpowiedź 1,083 wizyt
pytanie zadane 9 marca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
2 odpowiedzi 542 wizyt
pytanie zadane 18 listopada 2017 w C i C++ przez Bartek Franczak Nowicjusz (160 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...