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

Specjalizacja jawna - błąd

Object Storage Arubacloud
0 głosów
154 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Witam, 

za zadanie mam napisać jawną specjalizację dla łańcuchów char. Niestety program wyrzuca błąd na etapie definiowania jawnej specjalizacji. 

 

#include <iostream>

using namespace std;

template <typename T>
T maxn(T tablica[], int a)
{
   T b;

    b = tablica[0];
    for(int i = 1; i < a; i++)
    {
        if(tablica[i]>=b)
            b = tablica[i];
        else if (tablica[i] < b)
            continue;

    }
       return b;
}
template <>  const char* maxn (const char *t, int a);     //tutaj jest błąd 

int main()
{

    const char *lancuch[2] = {"xxxx","aa"};
    double tab[5] {1.7, 6.89, 8.99,7.00,1.00};
    int ta[4] {3 ,8 ,1 ,1};

    cout << maxn(ta,4);
    cout << endl;
    cout << maxn(tab,4);


    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 14 lutego 2020 przez Radfler VIP (101,030 p.)
wybrane 14 lutego 2020 przez amtrax
 
Najlepsza

Twoja specjalizacja zwraca inny typ niż pierwotny szablon. Powinno to wyglądać raczej tak:

template<>  const char maxn(const char* t, int a);

A najlepiej jest użyć zwykłego przeładowania nazwy:

const char maxn(const char* t, int a); // w tym wypadku funkcja może już zwrócić `const char*`
1
komentarz 14 lutego 2020 przez tkz Nałogowiec (42,000 p.)

Tak swoją drogą, to co Ty zrobiłeś nie jest specjalizacją szablonu, a funkcją, która "przeładowuje" szablon. Problem rozwiązuje 

template <const char*>  const char* maxn (const char *t, int a);

Co jest specjalizacją elementu funkcji szablonu. Jakbym się mylił, to proszę poprawić. 

komentarz 15 lutego 2020 przez Radfler VIP (101,030 p.)
template <const char*>  const char* maxn (const char *t, int a);

A to nie będzie raczej przeładowana funkcja z dodatkowym nienazwanym parametrem szablonu (sposób wywołania)? (ewentualnie mylę pojęcia)

komentarz 15 lutego 2020 przez tkz Nałogowiec (42,000 p.)

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf strona 390

#include <iostream>

template <typename T>
T maxn(T* tablica, int a) {
    std::cout << "maxn\n";
    return 0;
}

template<typename T = const char*>  T maxn(const char* t, int a);
int main() {

}
main:
  push rbp
  mov rbp, rsp
  mov eax, 0
  pop rbp
  ret
__static_initialization_and_destruction_0(int, int):
  push rbp
  mov rbp, rsp
  sub rsp, 16
  mov DWORD PTR [rbp-4], edi
  mov DWORD PTR [rbp-8], esi
  cmp DWORD PTR [rbp-4], 1
  jne .L5
  cmp DWORD PTR [rbp-8], 65535
  jne .L5
  mov edi, OFFSET FLAT:_ZStL8__ioinit
  call std::ios_base::Init::Init() [complete object constructor]
  mov edx, OFFSET FLAT:__dso_handle
  mov esi, OFFSET FLAT:_ZStL8__ioinit
  mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
  call __cxa_atexit
.L5:
  nop
  leave
  ret
_GLOBAL__sub_I_main:
  push rbp
  mov rbp, rsp
  mov esi, 65535
  mov edi, 1
  call __static_initialization_and_destruction_0(int, int)
  pop rbp
  ret

Oraz

#include <iostream>

template <typename T>
T maxn(T* tablica, int a) {
    std::cout << "maxn\n";
    return 0;
}

template<const char*>  const char* maxn(const char* t, int a);
int main() {

}
main:
  push rbp
  mov rbp, rsp
  mov eax, 0
  pop rbp
  ret
__static_initialization_and_destruction_0(int, int):
  push rbp
  mov rbp, rsp
  sub rsp, 16
  mov DWORD PTR [rbp-4], edi
  mov DWORD PTR [rbp-8], esi
  cmp DWORD PTR [rbp-4], 1
  jne .L5
  cmp DWORD PTR [rbp-8], 65535
  jne .L5
  mov edi, OFFSET FLAT:_ZStL8__ioinit
  call std::ios_base::Init::Init() [complete object constructor]
  mov edx, OFFSET FLAT:__dso_handle
  mov esi, OFFSET FLAT:_ZStL8__ioinit
  mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
  call __cxa_atexit
.L5:
  nop
  leave
  ret
_GLOBAL__sub_I_main:
  push rbp
  mov rbp, rsp
  mov esi, 65535
  mov edi, 1
  call __static_initialization_and_destruction_0(int, int)
  pop rbp
  ret

 

0 głosów
odpowiedź 14 lutego 2020 przez tkz Nałogowiec (42,000 p.)

Podobne pytania

+1 głos
2 odpowiedzi 321 wizyt
pytanie zadane 14 września 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
+1 głos
3 odpowiedzi 993 wizyt
0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 27 października 2016 w C i C++ przez sofnir Gaduła (4,690 p.)

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

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

...