2011-01-05 16 views
9

से बचें मेरे पास शीर्षलेख केवल फ़ाइल में निम्न कोड है।शीर्षलेख फ़ाइल में वैश्विक फ़ंक्शन परिभाषा है, और डुप्लिकेट प्रतीक लिंकेज त्रुटि

#pragma once 

class error_code { 
public: 
    unsigned __int64 hi; 
    unsigned __int64 lo;  
}; 

std::ostream& operator<< (std::ostream& o, const error_code& e) { 
    return o << "[" << e.hi << "," << e.lo << "]"; 
} 

मुझे लिंकेज त्रुटि मिलती है, जब परियोजना में 2 सीपीपी होते हैं तो यह हेडर फ़ाइल शामिल होती है।

त्रुटि LNK2005: "वर्ग error_code त्रुटि __cdecl ऑपरेटर | (कक्षा error_code त्रुटि स्थिरांक &, वर्ग ViTrox :: error_code त्रुटि स्थिरांक &)" (? ?? यू @@ YA AVerror_code @ 0 @ ABV10 @ 0 @ जेड) पहले से ही xxx.obj

में परिभाषित मैं अगर मैं एक cpp फाइल करने के लिए operator<< की परिभाषा ले जाते हैं, या एक DLL फ़ाइल के लिए मैं इस समस्या को हल कर सकते हैं, पता है।

हालांकि, मैं उन्हें सिंगल शीर्षलेख फ़ाइल में रखना चाहता हूं। क्या हासिल करने के लिए कोई तकनीक है? या क्या मुझे परिभाषा को दूसरी फाइल में अलग करना चाहिए?

+0

त्रुटि संदेश आपके कोड स्निपेट से मेल नहीं खाता है। –

उत्तर

16

inline कीवर्ड का उपयोग करें।

inline std::ostream& operator<< (std::ostream& o, const error_code& e) { 
    return o << "[" << e.hi << "," << e.lo << "]"; 
} 
+0

जिज्ञासा से, क्या आप जानते हैं कि कल्पना में कहां कहता है कि यह काम करता है? मैं इसे थोड़ी देर के लिए एक हैक के रूप में उपयोग कर रहा हूं, लेकिन मैंने कभी भी निर्णायक सबूत नहीं देखा है कि यह सही तरीके से काम करता है। – templatetypedef

+1

अध्याय और कविता नहीं, लेकिन आईआईआरसी यदि आपके पास 'इनलाइन' नहीं है तो यह ओडीआर का उल्लंघन करता है (और यदि आपके पास इनलाइन है लेकिन दो या दो से अधिक विभिन्न निकाय यह ओडीआर का भी उल्लंघन करता है)। –

+0

कंपाइलर इनलाइन और टेम्पलेट फ़ंक्शन निकायों को देखना चाहिए। अन्यथा यह अलग-अलग अनुवाद इकाइयों को संकलित करने के समय उन्हें इनलाइन नहीं कर सकता है या उन्हें तत्काल नहीं कर सकता है। – wilhelmtell

-1

.cpp फ़ाइल (ज फ़ाइल में नहीं)

//yoursource.cpp 
#include "yourheader.h" 

std::ostream& operator<< (std::ostream& o, const error_code& e) { 
    return o << "[" << e.hi << "," << e.lo << "]"; 
} 
6

या तो में इस समारोह को परिभाषित समारोह inline बनाने:

inline std::ostream& operator<< (std::ostream& o, const error_code& e) { 
    return o << "[" << e.hi << "," << e.lo << "]"; 
} 

या यह एक टेम्पलेट कार्य करना:

template<class Ch, class Tr> 
std::basic_ostream<Ch,Tr>& operator<< (std::basic_ostream<Ch,Tr>& o, 
             const error_code& e) { 
    return o << "[" << e.hi << "," << e.lo << "]"; 
} 
+0

क्यों एक टेम्पलेट भी काम करता है? टेम्पलेट्स रेखांकित हैं? – Icebone1000

3

आप Funct बना सकते हैं आयन static। यह आंतरिक संबंध निर्दिष्ट करता है, इसलिए यदि लिंक अन्य अनुवाद इकाइयों में पहले ही परिभाषित किया गया है तो लिंकर परवाह नहीं होगा।

या, जैसा कि पहले से ही उल्लेख किया गया है, आप इसे inline बना सकते हैं। इसमें अभी भी बाहरी संबंध है, लेकिन मानक बाहरी इनलाइन फ़ंक्शंस को एकाधिक अनुवाद इकाइयों में परिभाषा की अनुमति देता है।

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