2013-07-16 16 views
18

Czy potrzebuję funkcji szablonu inline, jeśli są one zawarte w kilku plikach cpp? Dzięki.funkcja wbudowanego szablonu?

template<bool> inline QString GetText(); 
template<> inline QString GetText<true>() {return "true";} 
template<> inline QString GetText<false>() {return "false";} 
+0

Co masz nadzieję dostać się z 'inline' funkcji szablonu? – Oswald

+0

możliwy duplikat [Czy użycie słów kluczowych z szablonami ma sens?] (Http://stackoverflow.com/questions/10535667/does-it-make-any-sense-to-use-inline-keyword-with -templates) –

Odpowiedz

21

Robisz to, ponieważ są to specjalizacje o pełnej funkcjonalności, a zatem podlegają regułom jednej definicji, tak jak normalne funkcje.

+1

Dla szablonu i nie w pełni wyspecjalizowanych mogę usunąć słowo kluczowe "inline" . Czy to jest poprawne? Jak 'szablon QString GetText();' – user1899020

+1

@ user1899020: Tak, możesz. – Mehrdad

0

Nie ma powodu, dla inline deklaracji dla szablonu, ale nie dla szablonu pełnej specjalizacji, nie trzeba dodawać słowa kluczowego inline na pierwszej linii, ale w drugim i trzecim potrzebne. Jednak każda jednostka tłumaczeniowa, która korzysta z szablonu, musi zawierać definicję szablonu, więc najlepiej jest włączyć ją do pliku nagłówkowego i dołączyć do innych cpps, które jej używają.

W standardzie C++ n3376 dla wersji 3.2/6 może istnieć więcej niż jedna definicja szablonu klasy dla całej aplikacji, ponieważ definicja jest taka sama.

===============

Aktualizacja bazy answere na Jesse dobre komentarze, (potrzeba inline dla szablonu pełnej sepcialization) Dzięki Jesse Dobry punkt, że.

+0

Potrzebujesz słowa kluczowego 'inline'. Są to szablony * specjalizacje * i naruszają ODR, jeśli są zawarte w wielu plikach źródłowych. –

+2

Zobacz '[temp.expl.spec]/12'" Wyraźna specjalizacja szablonu funkcji jest wbudowana tylko wtedy, gdy została zadeklarowana za pomocą wbudowanego specyfikatora lub zdefiniowanego jako usunięty i niezależnie od tego, czy jego szablon funkcji jest wbudowany. " – Mankarse

+0

@ZijingWu Masz na myśli wersję roboczą dla C++ 14. W bieżącym C++ 11 odpowiednia sekcja to 3.2/5. Ponadto, gdybyś zawarł pełną ofertę, zauważyłbyś, że wyjątkowe specjalizacje szablonów * nie * są wymieniane jako wyjątki w tej sekcji (ani w C++ 11, ani w C++ 14). – jogojapan

0

Wygląda na to, że metoda szablonowa musi być zdefiniowana w tym samym pliku, który buduje, Nie trzeba używać słowa kluczowego "inline", ponieważ zostały one skompilowane w każdym pliku cpp, który go zawiera.

13

Tak, potrzebujesz tam specyfikatora inline.

ODR (jedna zasada definicji) stwierdza, że ​​musi istnieć dokładnie jedna definicja zmiennej, funkcji, klasy, wyliczenia lub szablonu. Wyjątki istotne dla twojego pytania są wymienione w §3.2/5 (C++ 11) (podkreślenie moje):

Może istnieć więcej niż jedna definicja typu klasy (Klauzula 9), typ wyliczenia (7.2) , funkcja inline z łączeniem zewnętrznym (7.1.2), szablon klasy (klauzula 14), szablon funkcji niestatycznej (14.5.6), statyczny element danych szablonu klasy (14.5.1.3), funkcja składowa szablonu klasy (14.5.1.1) lub specjalizacja szablonu, dla której niektóre parametry szablonu nie są określone (14.7, 14.5.5) w programie pod warunkiem, że każda definicja pojawia się w innej jednostce tłumaczeniowej i pod warunkiem, że definicje spełniają następujące wymagania. [...]

specjalizacje szablonu dla których wszystkie parametry są określone (tj wyraźne specjalizacje) nie są wymienione tam i §14.7.3/12 mówi:

Wyraźna specjalizacja szablon funkcji jest wbudowany tylko wtedy, gdy jest zadeklarowany za pomocą wbudowanego specyfikatora lub zdefiniowany jako usunięty i niezależnie od tego, czy jego funkcja jest szablonowa. [Przykład:

template<class T> void f(T) { /∗ ... ∗/ } 
template<class T> inline T g(T) { /∗ ... ∗/ } 
template<> inline void f<>(int) { /∗ ... ∗/ } // OK: inline 
template<> int g<>(int) { /∗ ... ∗/ }   // OK: not inline 

- przykład end]

+0

Wygląda na to, że 'template <> int g <> (int) {/ * ... * /}' potrzebuje słowa kluczowego 'inline' w moich testach. – user1899020

+0

@ user1899020 Czy rzeczywiście przeczytałeś odpowiedź? Jeśli umieścisz go w kilku połączonych ze sobą plikach cpp, to tak, potrzebujesz wbudowanego. Tak mówi przykład (który pochodzi ze Standardu). – jogojapan

Powiązane problemy