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

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

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Предполагая, что я правильно понимаю ODR (скорее всего, нет :)), сокрытие вашей B<A<int> > реализации выглядит как требование, связанное с ODR.Если бы B<A<int> > не было скрыто, было бы возможно существование нескольких экземпляров A<> и ссылки на них, что привело бы к нарушению ODR. символьная видимость GCC Вики кратко описывает такие нарушения при использовании скрытой символьной видимости для «сущностей» с неопределенной связью, включая шаблоны (см. Раздел об исключениях).

Чего вы пытаетесь достичь с помощьюскрытие символов в шаблоне A<>?

0 голосов
/ 27 марта 2011

Если вы конкретно хотите скрыть встроенные методы A <>, попробуйте использовать -fvisibility-inlines-hidden

...