• 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.

VPS Starter Arubacloud
+1 głos
1,230 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ź 198 wizyt
pytanie zadane 11 czerwca 2016 w C i C++ przez VitGryfny Użytkownik (620 p.)
0 głosów
1 odpowiedź 490 wizyt
pytanie zadane 15 kwietnia 2020 w SQL, bazy danych przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 567 wizyt
pytanie zadane 26 listopada 2017 w C i C++ przez Bish0p Obywatel (1,940 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...