2011-03-21 9 views
9

Mam następujący kod kompilacji pod gcc z -fvisibility = ukryty:Problem z C++ argumentów szablonu z ukrytym widoczności

template<class T> struct /*__attribute__ ((visibility("default")))*/ A {}; 

template<class T> struct B 
{ 
    B() __attribute__ ((visibility("default"))); 
}; 

template<class T> B<T>::B() {} 

template class B<int>; 
template class B<A<int> >; 

Jeśli uruchomić plik wynikowy obiekt poprzez nm | grep B, otrzymuję

000000000002b97c t B<A<int> >::B() 
000000000002b972 t B<A<int> >::B() 
000000000002b968 T B<int>::B() 
000000000002b95e T B<int>::B() 

Tj B<int> jest widoczny, ale B<A<int> > jest niewidoczny. B<A<int> > staje się widoczny, jeśli odkomentowuję oznaczenie snippet A<T> jako widoczne. Jednak nie chcę oznaczać wszystkich A, ponieważ w rzeczywistym kodzie A<T> zawiera ogromną liczbę metod, które powinny pozostać prywatne.

Dlaczego widoczność A<T> wpływa na widoczność B<A<T> >? Czy mogę uczynić B<A<T> > widocznym bez pokazywania całego A<T>?

Odpowiedz

1

Zakładając, że rozumiem ODR poprawnie (najprawdopodobniej nie :)), ukrywanie twojej instantatiation B<A<int> > wygląda jak wymaganie ODR. Jeśli B<A<int> > nie byłby ukryty, możliwe byłoby istnienie wielu wystąpień członków A<> i odwoływanie się do nich, powodując naruszenie ODR. GCC symbol visibility Wiki krótko opisuje takie naruszenia, gdy używa się ukrytej widoczności symbolu na "jednostkach" z niejasnym powiązaniem, w tym z szablonami (zobacz rozdział dotyczący wyjątków).

Co próbujesz osiągnąć ukrywając symbole w swoim szablonie A<>?

+0

W moim kodu A <> to klasa wektor z wielu metod inline, a ja Nie chcę eksportować ich wszystkich ze względu na rozmiar pliku i czas ładowania. –

0

Jeśli konkretnie chcą ukryć metody Inline A <> spróbuj -fvisibility-inlines ukryte

+0

Używam -fvisibility = hidden, więc -visible-inlines-hidden jest zbędne. –

+0

Wygląda na to, ale wytyczne GCC zalecają dodanie go: 'W systemie kompilacji (Makefile itp.), Prawdopodobnie będziesz chciał dodać opcję -fvisibility = hidden i -ifvisibility-inlines-hidden do argumentów linii poleceń każdego GCC inwokacja 'http://gcc.gnu.org/wiki/Visibility – volpato

Powiązane problemy