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

[C++] Szablony funkcji w dwóch plikach.

Object Storage Arubacloud
+1 głos
1,248 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez Michał Gibas Pasjonat (19,610 p.)

Witam!

Mam funkcję np.

template<typename T> T foo(T a, T b){
 return a*b-(a+b);
}

I teraz nasuwa się pytanie jak to mogę rozbić na dwa pliki? Próbowałem już tak:

.h:

template<typename T> T foo(T, T);

.cpp:

template<typename T> T foo(T a, T b){
  return a*b-(a+b);
}

Ale kompilator rzuca mi exeptionem. Jak takie coś zrealizować?

Z góry dziekuję!

2 odpowiedzi

+3 głosów
odpowiedź 5 lutego 2017 przez vector Dyskutant (9,200 p.)
wybrane 5 lutego 2017 przez Michał Gibas
 
Najlepsza

template służy do generowania "rodziny" klas/funkcji etc. W celu wygenerowania kodu kompilator musi mieć dostęp do definicji. Kompilator kompilując jeden plik .cpp nie pamięta "szczegółów" drugiego pliku .cpp (nosi to nazwę separate compilation model) w którym jest zawarta definicja przez co dostajesz błąd od linkera.

Można to "obejść" w następujący sposób:

// 1.inl

template<typename T>
T foo(T lhs, T rhs) {
    return lhs + rhs;
}
// 1.hpp

#ifndef _FOO_HPP
#define _FOO_HPP

template<typename T>
T foo(T lhs, T rhs);

#include "1.inl"
#endif
// main.cpp

#include "1.hpp"

int main(void) {
    foo<short>(1, 1);
}

Można jeszcze powiedzieć, że c++11 wprowadził słowo kluczowe export, które ma na celu umożliwiać rozdzielanie wzorców na więcej niż jeden plik aczkolwiek nie jest to implementowane przez większość kompilatorów. Osobiście nie znam żadnego kompilatora, który by to implementował.

komentarz 5 lutego 2017 przez Szahid Pasjonat (20,930 p.)
Czy zapis 1.inl jest równoznaczny z 1.cpp ?
komentarz 5 lutego 2017 przez vector Dyskutant (9,200 p.)

Można zamiast inl podstawić dowolne inne rozszerzenie wliczając w to cpp.

komentarz 5 lutego 2017 przez Szahid Pasjonat (20,930 p.)
Dzięki. Tego potrzebowałem
+2 głosów
odpowiedź 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)
Rozbicie funkcji i klas szablonowych nie jest "oficjalnie" możliwe. Zarówno deklaracja, jak i definicja tych elementów programu musi znajdować się w jednym pliku, po to aby kompilator, przy konstruowaniu nowych obiektów miał dostęp do ich implementacji, żeby mógł podmienić typu generyczne (szablonowe), na konkretne typy danej instancji.

Jest jednak obejście, które umożliwia rozdzielenie deklaracji i definicji do dwóch osobnych plików. Wystarczy w pliku nagłówkowym (.h) zadeklarować funkcję, w drugim pliku z implementacja (np. .tpp) napisać do niej implementację i dołączyć plik .tpp za pomocą dyrektywy #include na koniec pliku nagłówkowego.

Tutaj masz przykład: http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file

Podobne pytania

0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 11 czerwca 2016 w C i C++ przez VitGryfny Użytkownik (620 p.)
0 głosów
1 odpowiedź 516 wizyt
pytanie zadane 15 kwietnia 2020 w SQL, bazy danych przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 575 wizyt
pytanie zadane 26 listopada 2017 w C i C++ przez Bish0p Obywatel (1,940 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

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

...