2013-08-06 5 views
5

मैं जीसीसी के लिए नया हूं, और मुझे gcc-4.7.2/4.7.3 में precompiled शीर्षलेख संकलित करते समय वास्तव में एक अजीब समस्या का सामना करना पड़ रहा है।पीएच में कॉन्स सदस्य समारोह के साथ कन्स्ट्रक्टर टकराव की प्रतिलिपि बनाएँ? एक जीसीसी बग?

नीचे कोड:

g++ -Wall -fexceptions -g -msse4.1 -Winvalid-pch -include "FooClass.h" -c FooClass.h -o FooClass.h.gch 
g++ -Wall -fexceptions -g -msse4.1 -Winvalid-pch -include "FooClass.h" -c FooClass.cpp -o obj/Debug/FooClass.o 

उत्पन्न होगा त्रुटियों:

FooClass.h

#include <cstddef> 
#include <X11/X.h> 
#include <xmmintrin.h> 
#include <emmintrin.h> 
#include <smmintrin.h> 

#ifndef FOO_CLASS_ERROR 
#define FOO_CLASS_ERROR 

class FooClass 
{ 
public: 
    union 
    { 
     struct 
     { 
      float x,y,z,w; 
     }; 
     __m128 v; 
    }; 

    FooClass(void) 
    { 
    } 

    FooClass(const __m128 _v) 
    : v(_v) 
    { 
    } 

    FooClass(const FooClass& rhs) 
    : v(rhs.v) 
    { 
    } 

    FooClass operator -(void) const; 

} __attribute__((aligned(16))); 

#endif 

FooClass.cpp

#include "FooClass.h" 

FooClass FooClass::operator -(void) const 
{ 
    return FooClass(); 
} 

PCH के रूप में संकलित

./pch.h:40:17: error: prototype for ‘FooClass FooClass::operator-() const’ does not match any in class ‘FooClass’ 
./pch.h:36:14: error: candidate is: FooClass FooClass::operator-() const 

मैं एक पूरी दोपहर के लिए चिह्नित किया है और पाया है कि:

"स्थिरांक" या प्रतिलिपि निर्माता इन त्रुटियों को हल करेंगे निकाला जा रहा है।

लेकिन मुझे नहीं पता क्यों ... क्या कोई मुझे इस कारण का कारण बता सकता है? या शायद यह एक जीसीसी बग है?

+2

सुनिश्चित करें कि आपने 'FooClass.h' को बदलने के बाद प्रीकंपील्ड हेडर को फिर से बनाया है। असली हेडर और पीसीएच के बीच एक desync के कारण निदान की तरह लगता है कि थोड़ा सा बग है। यानी एक नया build_ _ और हमें परिणाम बताएं। –

+2

यह समस्या नहीं है, लेकिन जिन नामों में लगातार दो अंडरस्कोर ('__FooClass__') शामिल हैं और नाम जो अंडरस्कोर से शुरू होते हैं उसके बाद पूंजी पत्र कार्यान्वयन के लिए आरक्षित होते हैं। उनका उपयोग न करें। –

+0

हां, मैंने एक साफ निर्माण किया था। और मुझे खराब कोड शैली के लिए खेद है, लेकिन मैं केवल कोड का एक न्यूनतम टुकड़ा बनाने की कोशिश कर रहा हूं जो इस समस्या को पुन: उत्पन्न कर सकता है, इसलिए कोड शैली को अनदेखा करें :-) –

उत्तर

0

यह एक बहुत ही अजीब त्रुटि है। परीक्षण करें कि क्या होता है यदि आप ऑपरेटर को इनलाइन करते हैं:

FooClass operator -(void) const 
{ 
    return FooClass(); 
} 
संबंधित मुद्दे