Проблема с аргументами шаблона C ++ со скрытой видимостью

Я компилирую следующий код в 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 видимый?

9
задан Geoffrey Irving 21 March 2011 в 16:40
поделиться