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

Geo*_*ing 9 c++ gcc templates 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> >;
Run Code Online (Sandbox Code Playgroud)

如果我通过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()
Run Code Online (Sandbox Code Playgroud)

即,B<int>可见但是B<A<int> >看不见. B<A<int> >如果我将片段标记取消注释为可见,则变为A<T>可见.但是,我不想将所有A标记为可见,因为在实际代码中A<T>包含大量应该保持私有的方法.

为什么能见度A<T>会影响能见度B<A<T> >B<A<T> >如果没有全部A<T>可见,我可以看到吗?

Voi*_*oid 1

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

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