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

Funkcja zwracająca automatycznie typ wartosci, gdzie bład?

Object Storage Arubacloud
0 głosów
157 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez Melchior Obywatel (1,300 p.)

Funkcja ma zwrocic najwieksza wartosc z tablicy

Czy to tak ma wygląda ? dostaje blad : (15) 'najwieksza': a function that returns 'auto' cannot be used before it is defined

#include <iostream>

using namespace std;




template<typename T>
auto najwieksza(T tab[] );

int main()
{
	const int max = 5;
	int tab[max] = { 1,2,3,4,5 };
	cout<<najwieksza(tab);
	double tab_double[max] = { 1.2,2.5,6.3,13.6,20.7 };
	cout << najwieksza(tab_double);
	return 0;
}
template<typename T>
auto najwieksza(T tab[])  
{
	T temp = tab[0];
	for (int i = 1; i < max; i++)
	{
		(tab[i] > temp) ? temp = tab[i] : continue; 
	}
	return decltype(temp);    
}

 

1 odpowiedź

+1 głos
odpowiedź 8 grudnia 2015 przez Radfler VIP (101,030 p.)
edycja 8 grudnia 2015 przez Radfler

Wymienię Ci błędy w punktach:

1. Przed C++14 funkcja nie może sobie od tak zwracać typu auto. Musisz użyć zwracania "ogonowego" (tak to sobie nazywam):

auto function() -> ReturnType;

(en.cppreference.com/w/cpp/language/function). Poza tym logiczne, że funkcja zwraca typ T.

2. Linijka 28: Zwracasz typ? Lepiej poczytaj co robi decltypehttps://forum.pasja-informatyki.pl/12004/co-oznacza-specyfikator-decltype. Ten operator po prostu wyciąga typ wyrażenia podanego w nawiasach.

3. Zmienna max (zadeklarowana w main) nie jest widoczna w funkcji najwieksza.

#EDIT

4. Instrukcja continue nie może być wstawiona jako argument w operatorze trójkowym. Przerób to na if-else.

komentarz 8 grudnia 2015 przez Melchior Obywatel (1,300 p.)

Działa, tak wiem, że zwracana wartosc bedzie typu T, ale chcialem uzyc tego decltype

#include <iostream>

using namespace std;


const int max = 5;

template<typename T>
auto najwieksza(T tab[])->decltype(*tab);

int main()
{
	
	int tab[max] = { 1,2,3,4,5 };
	cout << najwieksza(tab) << endl;
	double tab_double[max] = { 1.2,2.5,6.3,13.6,20.7 };
	cout << najwieksza(tab_double) << endl;

	cin.get();
	return 0;
}
template<typename T>
auto najwieksza(T tab[])->decltype(*tab)  
{
	T temp = tab[0];
	for (int i = 1; i < max; i++) 
	{
		if (tab[i] > temp)temp = tab[i];
		else continue;
	}
	return temp;    
}
Dziala, ale czy tak mialo to wygladac ? :D Dzieki za pomoc
komentarz 8 grudnia 2015 przez Radfler VIP (101,030 p.)

Hmm im tam wyskakuje błąd o wieloznaczności co do zmiennej max. Może dodaj w miejscach, gdzie używasz tej zmiennej operator zakresu:

::max // Odwołanie się do globalnej nazwy

W bibliotece standardowej jest funkcja std::max, stąd błąd.

Wyskakuje też groźne ostrzeżenie mówiące, że zwracasz referencję do zmiennej lokalnej. Może użyj takiego typu zwracanego:

// #include <type_traits>
typename std::remove_reference<decltype(*tab)>::type

Musisz usunąć referencję z typu, gdyż odwołanie się do wartości zwróconej przez tę funkcję skutkuje niezidentyfikowanym zachowaniem.

Podobne pytania

0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez Savuelo Początkujący (310 p.)
0 głosów
3 odpowiedzi 379 wizyt
pytanie zadane 4 lipca 2016 w C i C++ przez jaciekrece Nowicjusz (170 p.)
0 głosów
0 odpowiedzi 369 wizyt

92,580 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...