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

Funkcje auto

Object Storage Arubacloud
+1 głos
240 wizyt
pytanie zadane 29 kwietnia 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)

Hejka, mógłby mi ktoś wytłumaczyć jak stworzyć prototyp funkcji auto?

#include <iostream>
using namespace std;
template <class T,class T1> inline auto pokaz(T,T1)->double;
int main()
{
    cout <<pokaz(6.1,5.2);
}
template <class T,class T1> inline auto pokaz(T a,T1 b) -> decltype(a+b)
{
    decltype(a+b) x = a + b;
    return x;
}


Mam taki kod, ale nie chce się skompilować, zgaduje że ze względu na zły prototyp lecz nie wiem co powinienem zmienić.

3 odpowiedzi

0 głosów
odpowiedź 29 kwietnia 2016 przez Radfler VIP (101,030 p.)
Powinieneś zmienić w deklaracji funkcji typ zwracany z double na decltype(a+b). Wiąże się to z tym, że musisz nadać jakieś nazwy parametrom.
komentarz 1 maja 2016 przez Radfler VIP (101,030 p.)
edycja 1 maja 2016 przez Radfler

Przepraszam bardzo, za co ten downvote? Coś napisałem źle? Kod po poprawie działa bez zarzutu:

#include <iostream>
using namespace std;
template <class T,class T1> inline auto pokaz(T a,T1 b)->decltype(a+b);
int main()
{
    cout <<pokaz(6.1,5.2);
}
template <class T,class T1> inline auto pokaz(T a,T1 b) -> decltype(a+b)
{
    decltype(a+b) x = a + b;
    return x;
}

#EDIT Pytam serio. Chodzi o użycie inline, czy o to że zdefiniowałem szablon po jego użyciu?

0 głosów
odpowiedź 29 kwietnia 2016 przez MetGang Nałogowiec (34,360 p.)

Wystarczy poszukać po necie błędu: http://stackoverflow.com/questions/20749951/how-do-i-deduce-auto-before-a-function-is-called

Lecz po krótce. Nie jest to możliwe, aby stworzyć prototyp funkcji z auto, a później dać jej ciało (tak samo jak z constexpr i po części z inline). A dlaczego? Podobny scenariusz jest ze zmiennymi:

auto N = 0u; // działa, kompilator może przeprowadzić dedukcję

auto N;
N = 0u; // błąd, brak dedukcji już we wcześniejszej linii

Zauważ, że jeśli chodzi o funkcję (jak i zmienne extern) ich deklaracja i definicja mogą znajdować się w dwóch osobnych plikach, a model kompilacji C++ nie pozwala na latanie po wszystkich plikach i sprawdzanie gdzie co jest.

Z auto jest jak z szablonami, kompilator w trakcie kompilacji musi stworzyć nową funkcję na podstawie szablonu, a nie zrobi tego bez jej ciała.

–1 głos
odpowiedź 30 kwietnia 2016 przez JojololomenPL Bywalec (2,580 p.)
#include <iostream>
using namespace std;

template <class T,class T1> inline auto pokaz(T a,T1 b)
{
    decltype(a+b) x = a + b;
    return x;
}

int main()
{
    cout << pokaz(6.1,5.2);
}

Ten kod działa.

1. Nie można prototypować funkcji z szablonami. Muszą być deklarowane od razu w całości.

2. Nie potrzebujesz "->double" ani "->decltype(a+b)". ponieważ funkcja jest auto. Sama wie jakiego ma być typu.

3.PS. Nie musisz pisać "inline" kompilator zrobi to sam.

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 28 czerwca 2020 w HTML i CSS przez Sesil Animek Nowicjusz (150 p.)
+2 głosów
6 odpowiedzi 517 wizyt
0 głosów
2 odpowiedzi 1,949 wizyt
pytanie zadane 4 września 2019 w Offtop przez Nowicjusz89 Obywatel (1,050 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...