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

Czemu ten kod nie działa?

Object Storage Arubacloud
0 głosów
232 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Ostatnio zaczynam uczyć się, co to template i stworzyłem coś takiego:

 

#include <iostream>

using namespace std;

int ile_razy_tworzyc;

template<int ile_razy> ///Tworzenie szablonu

class Wypelnianie ///Klasa szablonu
{
public:
    /// Argumenty

    int Zmienna[ile_razy];
    ///Metody

    void Uzupelnianie()
    {
        int i=ile_razy;
        for(int i=ile_razy; i>0; i--)
        {
            cin >> Zmienna[i];
        }
    }

    void Pokazywanie()
    {
        for(int j=ile_razy; j>0; j--)
        {
            cout << Zmienna[j];
        }
    }
};


int main()
{
    ///Ile razy ma sie stworzyc
    cin >> ile_razy_tworzyc;

    ///Zmiana int na const int
    const int ile_tworzyc=ile_razy_tworzyc;

    ///Tworzenie

    Wypelnianie < ile_tworzyc > Klasa;
    ///Wywolywanie

    Klasa.Uzupelnianie();
    Klasa.Pokazywanie();

    ///Konczenie programu
    return 0;
}

I nagle błąd przy kompilacji.

 

PS. dla leniwych:

 

46    ile_tworzyc cannot appear in a constant-expression
46    template argument 1 is invalid

 

i 2 inne błędy nie warte uwagi (są spowodowane tymi z linijki 46)

2 odpowiedzi

+1 głos
odpowiedź 12 lutego 2016 przez MetGang Nałogowiec (34,360 p.)
wybrane 12 lutego 2016 przez Daaa22
 
Najlepsza

Błąd idealnie pokazuje czemu to nie działa. Argument szablonu jest nieodpowiedni, bo nie jest stałą. A dlaczego?

int x;
const int y = x;

y pomimo posiadania const nie jest znany w czasie kompilacji (przypisujesz nie-const do niego), a tylko takie wartości są przyjmowane przez argumenty szablonu.

komentarz 12 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)
Czyli template musi mieć z góry przypisaną wartość?
komentarz 12 lutego 2016 przez 0xf Dyskutant (8,180 p.)
template nie powinien byc const. Chyba
komentarz 12 lutego 2016 przez MetGang Nałogowiec (34,360 p.)

Wszystkie wartości jakie wysyła się do <> muszą być znane w trakcie kompilacji, czyli de facto muszą być const, które też jest znane w trakcie kompilacji (nie może być w trakcie działania programu przypisane). Na tym polegają szablony. Tworzą różne instancje/typy na podstawie wzoru.

komentarz 12 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

A da się w jakiś magiczny sposób przypisać do szablonu wartość, która nie jest const?

 

​mam na myśli coś takigo:

 

template (int zmienna)

komentarz 12 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Tak tak chodzi mi o to ze przed template'em przydaloby sie wczytac te zmienna.

Bynajmniej po deklaracji prototypy funkcji.
komentarz 12 lutego 2016 przez 0xf Dyskutant (8,180 p.)
Da sie ale mam pytanie po co ty zamieniasz int na cont int kiedy mozesz uzyc tego inta.
komentarz 12 lutego 2016 przez MetGang Nałogowiec (34,360 p.)

Oj panowie nie rozumiecie chyba.

MyClass<0> x;
MyClass<1> y;
const int zz = 15; MyClass<zz> z;

Dla kompilatora SĄ TO 3 INNE TYPY DANYCH tak samo jak intfloat czy double, a stworzenie nowego typu danych w czasie trwania programu jest niemożliwe, gdyż kompilator MUSI wiedzieć na jakim typie danych pracuje. Nie bez powodu nazywa się to szablonem, gdyż służy do tworzenia różnych rzeczy na podstawie jednej bazowej.

+1 głos
odpowiedź 12 lutego 2016 przez criss Mędrzec (172,590 p.)
edycja 12 lutego 2016 przez criss

Template-y działają w taki sposób, że kompilator wyszukuje w kodzie deklaracji obiektów szablonowej klasy i na podstawie parametru szablonu tworzy nową klase w czasie kompilacji. Także parametr szablonu, czy to jest typ czy, tak jak w twoim przypadku - wartość, musi być znany w czasie kompilacji.

komentarz 12 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)
Już ogarnołem :)

(patrz komentarz wyżej)

Podobne pytania

0 głosów
4 odpowiedzi 376 wizyt
pytanie zadane 6 grudnia 2015 w C i C++ przez tetriss Obywatel (1,710 p.)
0 głosów
2 odpowiedzi 406 wizyt
pytanie zadane 25 marca 2016 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
1 odpowiedź 541 wizyt
pytanie zadane 28 marca 2016 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

92,621 zapytań

141,475 odpowiedzi

319,816 komentarzy

62,005 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!

...