Я компилирую следующий код в 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
отображается, но B >
невидимо. B >
становится видимым, если я раскомментирую отметку A
как видимую. Однако я не хочу отмечать все A как видимые, поскольку в реальном коде A
содержит огромное количество методов, которые должны оставаться закрытыми.
Почему видимость делает видимость
A
влияет на видимость B >
? Могу ли я сделать B >
видимым, не делая все A
видимый?