2011-03-21 12 views
9

Estoy compilando el código siguiente bajo gcc con -fvisibility = hidden:Problema con C++ argumentos de plantilla con la visibilidad oculto

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> >; 

Si funciono el archivo objeto resultante a través nm | grep B, consigo

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

es decir, B<int> es visible, pero es invisible B<A<int> >. B<A<int> > se vuelve visible si elimino el comentario de la marca de fragmento A<T> como visible. Sin embargo, no quiero marcar todo A visible, ya que en el código real A<T> contiene una gran cantidad de métodos que deben permanecer privados.

¿Por qué la visibilidad de A<T> afecta la visibilidad de B<A<T> >? ¿Puedo hacer B<A<T> > visible sin hacer todo A<T> visible?

Respuesta

1

Suponiendo que entiendo correctamente el ODR (probablemente no :)), ocultar su B<A<int> > instantánea parece un requisito relacionado con ODR. Si B<A<int> > no estaba oculto, sería posible que existieran múltiples instancias de los miembros A<> y se haga referencia a ellas, lo que daría lugar a una violación de ODR. El documento symbol visibility Wiki de GCC describe brevemente tales violaciones cuando se utiliza la visibilidad de símbolos ocultos en "entidades" con vínculos vagos, incluidas las plantillas (consulte la sección sobre excepciones).

¿Qué intenta lograr ocultando los símbolos en su plantilla A<>?

+0

En mi código A <> es una clase de vectores con un gran número de métodos inline, y yo' Me gustaría evitar exportarlos todos por el tamaño del archivo y el tiempo de carga. –

0

Si desea específicamente para ocultar los métodos en línea de A <> intente utilizar -fvisibility-inline-oculta

+0

Estoy usando -fvisibility = hidden, por lo que -fvisibility-inlines-hidden es superfluo. –

+0

Parece que sí, pero las directrices de GCC recomiendan agregarlo: 'En su sistema de compilación (Makefile, etc.), probablemente desee agregar las opciones -fvisibility = hidden y -fvisibility-inlines-hidden a los argumentos de línea de comando de cada GCC invocación' http://gcc.gnu.org/wiki/Visibility – volpato

Cuestiones relacionadas