साथ ओडीआर का उल्लंघन उत्पादन पुस्तकालयों से कोड ऑनलाइन पढ़ने पर से बचने के लिए मैं इसलक्षण कक्षाएं
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
अपने आप में विशेष कर दिया गया है पर ध्यान न दें। मैं एक बेहतर उदाहरण के बारे में नहीं सोच सका ..
'विशेष' की परिभाषा के समान ही हेडर में विशेषज्ञता रखें। –
@PeteBecker अच्छा विचार! मुझे उस प्रश्न में शामिल होना चाहिए था। लेकिन क्या होगा यदि आपके पास उस तक पहुंच नहीं है? उदाहरण के लिए कहें कि यह 'बूस्ट' मॉड्यूल – Curious
के लिए विशेषज्ञता है, विशेषज्ञता के साथ शीर्षलेख में घोषणा के साथ शीर्षलेख शामिल करें, और केवल बाद में शामिल करें। –