Я компилирую следующий код в gcc с -fvisibility = hidden:
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> >;
Если я запускаю полученный объектный файл через nm | grep B, я получаю
000000000002b97c t B<A<int> >::B()
000000000002b972 t B<A<int> >::B()
000000000002b968 T B<int>::B()
000000000002b95e T B<int>::B()
Т.е., B<int>
видим, но B<A<int> >
невидим. B<A<int> >
становится видимым, если я раскомментирую фрагмент кода с пометкой A<T>
как видимый. Однако я не хочу отмечать все A видимыми, поскольку в реальном коде A<T>
содержит огромное количество методов, которые должны оставаться закрытыми.
Почему видимость A<T>
влияет на видимость B<A<T> >
? Могу ли я сделать B<A<T> >
видимым, не делая все A<T>
видимыми?