带有隐藏可见性的C ++模板参数问题

时间:2011-03-21 16:40:02

标签: c++ templates gcc visibility symbols

我正在使用-fvisibility = hidden:

在gcc下编译以下代码
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>的情况下显示{{1}}吗?

2 个答案:

答案 0 :(得分:1)

假设我正确理解ODR(我可能不会:)),隐藏您的B<A<int> >即时化看起来像是与ODR相关的要求。如果未隐藏B<A<int> >,则A<>成员的多个即时消息可能存在并被引用,从而导致ODR违规。 GCC的symbol visibility Wiki简要描述了在“实体”上使用隐藏符号可见性与模糊链接(包括模板部分)时的此类违规行为(参见有关例外的部分)。

您想通过隐藏A<>模板中的符号来实现什么目标?

答案 1 :(得分:0)

如果您特别希望隐藏A&lt;&gt;的内嵌方法。尝试使用 -fvisibility-内联隐藏