2017-06-10 2 views
5
verletzen

Beim Lesen Code online aus der Produktion Bibliotheken fand ich so etwas wie diesesWie kann man vermeiden ODR mit Klassen Züge

Traits.hpp

template <typename Type> 
class Traits { 
    template <typename T, 
       detail::EnableIfIsInstantiation<T, Type>* = nullptr> 
    static void foo(T& object) { 
     object.foo(); 
    } 
}; 

SpecialTraits.hpp

template <> 
class Traits<Special> { 
    static void foo(Special& object) { 
     object.foo(); 
    } 
    static void foo(Special&& object) { 
     object.special_foo(); 
    } 
}; 

Dies führt zu einer ODR-Verletzung, wenn eine Bibliothek einen Typ instanziiert, derverwendetfür Something in einer Übersetzungseinheit ohne SpecialTraits.hpp und instanziiert dann einen Typ, der die spezialisierten Merkmale in einer anderen Übersetzungseinheit verwendet. Dies würde eine ODR-Verletzung verursachen, wenn diese beiden Übersetzungseinheiten miteinander verbunden sind.

Wie wird dieses Problem vermieden? Muss ich auf alle Spezialisierungen in der ursprünglichen Datei Traits.hpp zurückgreifen? Und was, wenn ich die Datei mit der Definition für Special nicht bearbeiten darf?

Hinweis Bitte ignorieren die Tatsache, dass foo() von Special sich im && Fall spezialisiert haben könnte. Ich könnte mir kein besseres Beispiel vorstellen.

+1

Setzen Sie die Spezialisierung in den gleichen Header wie die Definition von 'Special'. –

+0

@PeteBecker Guter Gedanke! Ich hätte das in die Frage aufnehmen sollen. Aber was ist, wenn Sie keinen Zugang dazu haben? Zum Beispiel ist dies eine Spezialisierung für ein "Boost" -Modul – Curious

+0

Fügen Sie den Header mit der Deklaration in der Kopfzeile mit der Spezialisierung, und nur die später jemals enthalten. –

Antwort

3

Setzen Sie die Spezialisierung in "WidgetWrapper.hpp" anstelle von "Widget.hpp" und "WidgetWrapper.hpp" überall enthalten. Andernfalls, einen Fehlerbericht mit Boost einreichen und erwarten, dass es nirgendwohin geht, da dieses genaue problem vor 15 Jahren ohne Auflösung besprochen wurde.

Verwandte Themen