Explicitná špecializácia – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Explicitná špecializácia – C / C++ – Fórum – Programujte.comExplicitná špecializácia – C / C++ – Fórum – Programujte.com

 

Robo
~ Anonymní uživatel
82 příspěvků
13. 7. 2013   #1
-
0
-

Mám za úlohu napísať šablónu funkcie maxn(), ktorá príma ako argumenty pole položiek typu T a celé číslo reprezentujúce počet prvkov pola a ktorá vracia jeho najväčší prvok. Ďalej mám vytvoriť špecializáciu, ktorá preberá pole ukazovateľov na char ako jeden argument a počet ukazovateľ ako druhý argument a ktorá vracia adresu najdlhšieho reťazca.

A práve s tým prototypom explicitnej špecializácie mám problém, nechce mi ho uznať.

#include <iostream>

using namespace std;

template <typename T>
T maxn(const T arr[], int n);

template <> char *maxn<char, int>(const char *arr[], int n); // nechce uznat *maxn

int main()
{
	int arr1[] = {9, 0, 69, 44, 55, 3};
	double arr2[] = {0.5, 5.9, 8.45, 69.69};

	cout << "najvacsi prvok je: " << maxn(arr1, 6) << endl;
	cout << "najvacsi prvok je: " << maxn(arr2, 4) << endl;


	system("PAUSE");
}

template <typename T>
T maxn(const T arr[], int n){
	T max = 0;

	for(int i = 0; i < n; i++){
		if(arr[i] > max)
			max = arr[i];
	}

	return max;
}
Nahlásit jako SPAM
IP: 188.112.111.–
vitamin+8
Grafoman
13. 7. 2013   #2
-
0
-

#1 Robo
Template funkciu nemozes specializovat, ale mozes ju pretazit:

#include <iostream>
#include <string>

template <typename T, size_t N>
T maxn(const T (&arr)[N]){
	if(!N)return T();
	T max = arr[0];

	for(size_t i = 1; i < N; i++)
		if(arr[i] > max)
			max = arr[i];
	
	return max;
}

template <size_t N>
std::string& maxn(std::string (&arr)[N]){
	static_assert(N != 0, "chyba: nie je mozne vratit maximum z prazdneho pola");
	std::string* max = &arr[0];

	for(size_t i = 1; i < N; i++)
		if(arr[i].size() > max->size())
			max = &arr[i];
	
	return *max;
}

int main()
{
	int arr1[] = {9, 0, 69, 44, 55, 3};
	double arr2[] = {0.5, 5.9, 8.45, 69.69};
	std::string arr3[] = {"123", "1", "12345678", "1234"};

	std::cout << "najvacsi prvok je: " << maxn(arr1) << std::endl;
	std::cout << "najvacsi prvok je: " << maxn(arr2) << std::endl;
	std::cout << "najvacsi prvok je: " << maxn(arr3) << std::endl;

}

Uz ti staci len nahradit stringy za char-y a pouzit std::strlen na zistenie dlzky.

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Robo
~ Anonymní uživatel
82 příspěvků
13. 7. 2013   #3
-
0
-

#2 vitamin
Tak ale ja musím postupovať podľa zadania a vytvoriť špecializáciu.
Robím to podľa knihy (Mistrovství v C++) a tam je napísané že to ide. Konkrétne: "Pre dané meno funkcie môžeme mať nešablónovú funkciu, šablónovú funkciu a explicitnú špecializáciu ŠABLÓNOVEJ funkcie".
Je tam aj tento príklad

struct job{
	char name[40];
	double salary;
	int floor;
}

void swap(job &, job &); //prototyp nesablonovej funkcie

template <typename T>
void swap(any &, any &); //prototyp sablony

template <> void swap <job>(job &, job &); //explicitna specializacia

No a ja mám ten problém, že mne nechce uznať tento prototyp

template <> char *maxn<char, int>(const char *arr[], int n);

Keď to porovnávam s prototypom z knihy, tak to mám tak isto, len mám iné typy

Nahlásit jako SPAM
IP: 188.112.111.–
vitamin+8
Grafoman
13. 7. 2013   #4
-
0
-

#3 Robo

template <typename T>
T maxn(const T* arr, size_t n);

template <> 
char* maxn<char*>(char* const *arr, size_t n);

//alebo:

typedef char* str_t;
template <> 
str_t maxn<str_t>(const str_t *arr, size_t n);

Co sa tyka specializacie, tak to som napisal blbost, funkcia ide specializovat, ale nejde ciastocne specializovat.

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý