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

Dlaczego tak maly szczegol decyduje o tym czy kod sie skompiluje

Object Storage Arubacloud
0 głosów
177 wizyt
pytanie zadane 22 lutego 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
edycja 22 lutego 2016 przez 0xf

Przedstawie kilka wersji tego samego kodu :

#include "Wczytywajka.hpp"
#include <string>

using namespace std;

template<typename T> void inputer(){}

template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
    cout<<x<<endl;
    inputer<T>(rest...);
}

int main()
{
    inputer<string>("gg","gg");
    return 0;
}

^ Dziala

#include "Wczytywajka.hpp"
#include <string>

using namespace std;

template<typename T> void inputer(){};

template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
    cout<<x<<endl;
    inputer<T>(rest...);
}

int main()
{
    inputer<string>("gg","gg");
    return 0;
}

^Dziala

#include "Wczytywajka.hpp"
#include <string>

using namespace std;

template<typename T> void inputer();

template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
    cout<<x<<endl;
    inputer<T>(rest...);
}

int main()
{
    inputer<string>("gg","gg");
    return 0;
}

^ Nie dziala. 

Czy moglby mi ktos wytlumaczyc o co w tym chodzi. 

Zapomnialem powyzej, Czesc!!!, dzieki za pomoc i pozdrawiam.

Te dziwne html'owe znaczniki dodaje to forum w poczatkowym zamysle mialo tam byc () ale sie psuje.

Dobra teraz wlasnie sprobowalem napisac ciutke inna funkcje niz powyzsze za pomoca parameter pack'a o to kod :

#include "Wczytywajka.hpp"
#include <string>

using namespace std;

template<typename T> void inputer(){}

template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
    cin>>x;
   inputer<T>(rest...);
}

int main()
{
    int a,b;
    inputer<int>(a,b);
    return 0;
}

I pytanie jest takie gdy kompiluje dostaje tylko blad :Wczytywajka.cpp|| undefined reference to `void inputer<int, int>(int&, int)'| a codeblocks mi nawet nie podkresla w ktorej linii jest blad ktos wie o co chodzi i dlaczego kod sie nie kompiluje ? 

komentarz 24 listopada 2020 przez Sadako Obywatel (1,240 p.)

Troche to zagmatwane wszystko, ale z tego co widze, to w ostatnim bloczku kodu (czwartym), to raczej nie zadziała, bo masz cin >> x,  a zmienna x jest typu const T&.
Nie możesz modyfikować zmiennej const, a to dokładnie robi cin :)

Po usunięciu słowka const już się powinno skompilować, ale jeśli Twoją intencją jest wczytać wszystkie zmienne, to nadal nie zadziała (mimo, że się skompiluje) :D
Spróbuj sobie wczytać a i b, a potem wyprintować. Zobaczysz, że b nie będzie miało wczytanej wartości. Problem polega na tym, że Rest przekazujesz przez wartość, a powineneś przez referencje. Obecne rozwiązanie (dla dwóch intów) jest równoważne temu:

void inputer(int& x)
{
  cin >> x;
}

void inputer(int& x, int y)  // Tutaj brak '&' przy y
{
  cin >> x;
  inputer(y);
}

Także zamiana deklaracji na następującą powinna pomóc:

template<typename T,typename... Rest> void inputer(T& x, Rest&... rest)


Pro Hint: Polecam dopisać #include <iostream> do pliku Wczytywajka.cpp. Jeśli używasz iostream w pliku źrodłowym to "inkluduj" z pliku źródłowego. Podejrzewam, że w pliku nagłowkowym "Wczytywajka.hpp" masz teraz #include<iostream>. Jeśli nie użyuwasz iostream w pliku nagłowkowym to go stamtąd usuń.
Takie coś jest bardziej przejrzyste, a co ważniejsze - może zredukować czas kompilacji. Dlaczego? To długi wykład :), ale jeśli Cię zainteresowało to polecam poczytać jak wygląda kompilacja i co to jest compilation unit.

1 odpowiedź

0 głosów
odpowiedź 22 lutego 2016 przez jpacanowski VIP (101,940 p.)
Zróbcie coś z tymi cholernymi emotikonami...
komentarz 22 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Niestety nie mam na to wplywu :(

Podobne pytania

0 głosów
1 odpowiedź 375 wizyt
0 głosów
2 odpowiedzi 232 wizyt
pytanie zadane 13 października 2015 w C i C++ przez grzesieka Nowicjusz (120 p.)

92,674 zapytań

141,576 odpowiedzi

320,045 komentarzy

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

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!

...