2012-04-18 7 views
10

Czy to O.K. zdefiniować wirtualną funkcję szablonu klasy poza jego treścią? Funkcja wirtualna nie może być wstawiona, ale aby uniknąć wielu definicji w jednostkach kompilacji, należy oznaczyć je jako inline (zakładając, że nagłówki szablonów będą zawarte w wielu plikach źródłowych). Z drugiej strony kompilator może ignorować inline, więc wydaje się, że jest to poprawne. Na przykład poniższy kod jest poprawny:Definicje szablonów poza treścią klasy

template <typename T> 
class C 
{ 
public: 
    virtual void f(T val); 
}; 

template <typename T> 
inline 
void C<T>::f(T val) 
{ 
    //definition 
} 

?

BTW gcc (3.4.2) pozwala na pominięcie inline przed definicją funkcji f(T val), ale nie przed analogiczną funkcją zwykłej klasy. Czy to tylko zachowanie gcc?

+5

Używasz gcc * 3.4.2 *? – jpalecek

+0

@jpalecek w tym konkretnym przykładzie, tak. – doc

+1

@doc - Funkcje wirtualne * może * być zadeklarowane jako 'inline' (ale to nie jest tutaj potrzebne). Kompilator ma nieco trudniejsze zadanie, aby dokładnie określić, kiedy funkcje mogą być wbudowane. –

Odpowiedz

10

Tak, to jest OK, nawet bez inline To działa tak samo dla zwykłych funkcji składowych i zmienne statyczne:

// everything in the header: 
template <class T> 
class A 
{ 
    static int i; 
}; 

template <class T> 
int A<T>::i=0; 

Standardowy cytat: (3,2/5)

Nie może być mor e niż jedna definicja typu klasy (klauzula 9), typ wyliczenia (7.2), funkcja inline z zewnętrznego powiązania (7.1.2), szablon klasy (klauzula 14), szablon funkcji niestatycznej (14.5.6), statyczny element danych szablonu klasy (14.5.1.3), funkcja członkowska 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 dostarczonym programie że każda de fi nicja pojawia się w di ff jednostki tłumaczeniowej erent, i pod warunkiem, że de fi nicje spełniać następujące wymagania ...

wymagania w zasadzie powiedzieć dwie definicje muszą być identyczne.

Nie działa w przypadku zwykłych zajęć. W całym programie musi być co najwyżej jedna definicja.

+0

Dlaczego ktoś nie głosował na tę odpowiedź:? – doc

3

Możesz tam zdefiniować funkcje, o ile każdy kod, który musi wykonać daną funkcję, ma widoczność tego kodu podczas kompilacji (nie czas połączenia).

To dość powszechne, aby oddzielić szablon na 2 pliki, z których jeden jest tradycyjnym nagłówkiem, a drugi jest implementacją, podobnie jak w przypadku niesformatowanych funkcji i ich implementacji. Jedyna różnica polega na tym, że musisz # dołączyć plik implementacji szablonu oraz nagłówek, gdy chcesz go użyć.

4

Możesz zdefiniować metody szablonów poza definicją class, w tym samym nagłówku, bez używania inline i bez otrzymywania błędów wielokrotnej definicji.

Dzieje się tak, ponieważ funkcja szablonu nie generuje samej definicji, jeśli nie jest w pełni wyspecjalizowana. Aby to udowodnić, należy:

void C<int>::f(int) 
{ 
} 

spowoduje błąd linkera, ponieważ funkcja ma w tym przypadku definicję. (Pod warunkiem, że uwzględnienie tego w wielu jednostek tłumaczeniowych Jeśli oznaczyć go inline:...

inline void C<int>::f(int) 
{ 
} 

błąd już nie występuje

Powiązane problemy