2011-01-09 13 views
7

चेतावनी बनाने मैं एक सी मजाक कर रहा हूँ ++ वर्ग जो Google Mock और VS2010 का उपयोग कर 2 अतिभारित कार्य हैं:गूगल मॉक: मज़ाक उड़ाया अतिभारित कार्यों C4373

#include "stdafx.h" 
#include "gmock/gmock.h" 

#include "A.h" 

class MockA : public A 
{ 
public: 
    // ... 
    MOCK_METHOD3(myFunc, void(const int id, const int errorCode, const CString errorMsg)); 
    MOCK_METHOD1(myFunc, void(const CString errorMsg)); 
    // ... 
}; 

हर बार जब मैं संकलन मैं दो बार चेतावनी निम्नलिखित मिलती है:

1>c:\dev\my_project\tests\mocka.h(83): warning C4373: 'MockA::myFunc': virtual function overrides 'A::myFunc', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers 
1>   c:\dev\my_project\my_project\include\a.h(107) : see declaration of 'A::myFunc' 

कोई विचार क्यों?
क्या यह सही व्यवहार है?
मैं इससे कैसे बच सकता हूं?

+1

करें कि आप सही संस्करण उपयोग कर रहे हैं - जब 'A' की विधि आप अधिभावी रहे हैं' const' है MOCK_CONST_METHOD इस्तेमाल किया जाना चाहिए। –

+0

@ बिली ओनेल - विधि स्वयं ही नहीं है, केवल इसके पैरामीटर हैं। क्या मुझे अभी भी MOCK_CONST_METHOD का उपयोग करना चाहिए? – Jonathan

+0

नहीं; उस स्थिति में आपको वह करना चाहिए जो आप कर रहे हैं :) –

उत्तर

9

यदि यह नया कोड है, तो आपको ठीक होना चाहिए। C4373 warning कह रहा है कि विजुअल स्टूडियो के पुराने संस्करणों ने मानक का उल्लंघन किया। जुड़ा हुआ प्रलेखन से:

संकलक विजुअल C++ 2008 से पहले के संस्करण समारोह को विधि आधार वर्ग में मुद्दा एक चेतावनी संदेश के लिए बाध्य है, तो। कंपाइलर के बाद के संस्करण कॉन्स या अस्थिर क्वालीफायर को अनदेखा करते हैं, व्युत्पन्न कक्षा में विधि में फ़ंक्शन को बाध्य करें, फिर चेतावनी C4373 जारी करें। यह बाद का व्यवहार C++ मानक का अनुपालन करता है।

यह केवल एक समस्या होगी यदि आपने विजुअल स्टूडियो के गलत व्यवहार पर निर्भर कोड तोड़ दिया था।

+0

मुझे यकीन है कि आप सही हैं। क्या आपके पास इसका समर्थन करने का संदर्भ है? कहीं लोग इस पर चर्चा कर रहे हैं वास्तव में पिछले झूठे व्यवहार है? इसके अलावा - मैं इस विशिष्ट चेतावनी को कैसे म्यूट कर सकता हूं? – Jonathan

+1

@ जोन, यह लिंक में समझाया गया है। अंतिम भाग पर ध्यान दें, "यह बाद वाला व्यवहार सी ++ मानक का अनुपालन करता है।" –

+0

धन्यवाद। मैंने चेतावनी को दबाने के लिए निम्नलिखित का उपयोग किया: http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c – Jonathan

3

मेरे लिए (वीएस 2010 में), const को आदिम प्रकार पैरामीटर (जिसे मैं आपके पास भी देखता हूं) पर निर्दिष्ट करता हूं, इस व्यवहार का कारण बनता है। जब भी बेस क्लास फ़ंक्शन में ऐसा अस्तित्व में था, मैं ओवरराइड करना चाहता था, मैं इस तरह से नकली निर्दिष्ट नहीं कर सका ताकि यह चेतावनी न हो; जब केवल क्लास टाइप कॉन्स वैल्यू/कॉन्स रेफरेंस पैरामीटर होते हैं, तो चेतावनी कभी नहीं होती है।

तो मेरे लिए ऐसा लगता है कि उस मामले में चेतावनी वास्तव में संकलक में एक गलती है (जैसा हस्ताक्षर बिल्कुल वही हैं)।

0

वैकल्पिक दृष्टिकोण सुझाव:

#include "stdafx.h" 
#include "gmock/gmock.h" 

#include "A.h" 

class MockA : public A 
{ 
public: 
    // ... 

    void myFunc(const int id, const int errorCode, const CString errorMsg) { 
     mocked_myFunc3(id, errorCode, errorMsg); 
    } 

    void myFunc(const CString errorMsg) { 
     mocked_myFunc1(errorMsg); 
    } 

    MOCK_METHOD3(mocked_myFunc_3, void(const int id, const int errorCode, const CString errorMsg)); 
    MOCK_METHOD1(mocked_myFunc_1, void(const CString errorMsg)); 
    // ... 
}; 
संबंधित मुद्दे