Ich kompiliere den folgenden Code unter gcc mit -visibility = hidden:
%Vor%Wenn ich die resultierende Objektdatei über nm | Grep B, ich bekomme
%Vor% I.e., B<int>
ist sichtbar, aber B<A<int> >
ist unsichtbar. B<A<int> >
wird sichtbar, wenn ich die Snippet-Markierung A<T>
als sichtbar auszeichne. Allerdings möchte ich nicht alle von A sichtbar machen, da A<T>
im realen Code eine Vielzahl von Methoden enthält, die privat bleiben sollen.
Warum beeinflusst die Sichtbarkeit von A<T>
die Sichtbarkeit von B<A<T> >
? Kann ich B<A<T> >
sichtbar machen, ohne alle A<T>
sichtbar zu machen?
Wenn ich davon ausgehe, dass ich das ODR richtig verstanden habe (wahrscheinlich nicht :)), sieht es so aus, als ob Sie Ihre B<A<int> >
-Instanziierung ausblenden würden. Wenn B<A<int> >
nicht ausgeblendet wurde, könnten mehrere Instanzen von A<>
-Elementen existieren und referenziert werden, was zu einer ODR-Verletzung führen würde. GCC Symbolsichtbarkeitswiki beschreibt kurz solche Verstöße, wenn die Sichtbarkeit versteckter Symbole auf "Entitäten" mit verwendet wird vage Verknüpfung, einschließlich Vorlagen (siehe Abschnitt über Ausnahmen).
Was möchten Sie erreichen, indem Sie die Symbole in Ihrer A<>
Vorlage ausblenden?
Tags und Links c++ gcc templates visibility symbol