2017-06-10 13 views
5

साथ ओडीआर का उल्लंघन उत्पादन पुस्तकालयों से कोड ऑनलाइन पढ़ने पर से बचने के लिए मैं इसलक्षण कक्षाएं

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(); 
    } 
}; 

यदि पुस्तकालयका उपयोग करता है तो यह एक ओडीआर उल्लंघन का कारण बनता है Something के लिएएक अनुवाद इकाई में SpecialTraits.hpp सहित और फिर एक प्रकार को तत्काल करता है जो किसी अन्य अनुवाद इकाई में विशेष लक्षणों का उपयोग करता है। इससे ओडीआर उल्लंघन हो सकता है जब उन दो अनुवाद इकाइयों को एक साथ जोड़ा जाता है।

इस समस्या से बचने के लिए सुझाए गए तरीके क्या हैं? क्या मुझे मूल Traits.hpp फ़ाइल में सभी विशेषज्ञता शामिल करने का सहारा लेना है? और क्या होगा यदि मुझे Special की परिभाषा के साथ फ़ाइल को संपादित करने की अनुमति नहीं है?

नोट कृपया तथ्य यह है कि foo() सकता && मामले में Special अपने आप में विशेष कर दिया गया है पर ध्यान न दें। मैं एक बेहतर उदाहरण के बारे में नहीं सोच सका ..

+1

'विशेष' की परिभाषा के समान ही हेडर में विशेषज्ञता रखें। –

+0

@PeteBecker अच्छा विचार! मुझे उस प्रश्न में शामिल होना चाहिए था। लेकिन क्या होगा यदि आपके पास उस तक पहुंच नहीं है? उदाहरण के लिए कहें कि यह 'बूस्ट' मॉड्यूल – Curious

+0

के लिए विशेषज्ञता है, विशेषज्ञता के साथ शीर्षलेख में घोषणा के साथ शीर्षलेख शामिल करें, और केवल बाद में शामिल करें। –

उत्तर

3

"विजेट.hpp" के बजाय "WidgetWrapper.hpp" में विशेषज्ञता रखें और हर जगह "WidgetWrapper.hpp" शामिल करें। अन्यथा, बूस्ट के साथ एक बग रिपोर्ट दर्ज करें और इसे कहीं भी जाने की उम्मीद नहीं है क्योंकि इस सटीक problem पर 15 साल पहले कोई संकल्प नहीं हुआ था।

संबंधित मुद्दे