2013-08-06 2 views
5

Ich bin neu in gcc, und ich habe ein wirklich seltsames Problem beim Kompilieren vorkompilierte Header in gcc-4.7.2/4.7.3.Kopieren Konstruktor Konflikte mit Konst-Member-Funktion in PCH? Ein gcc-Fehler?

Die Codes unter:

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

als PCH zusammengestellt:

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 

werden Fehler erzeugen:

./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 

Ich habe einen ganzen Nachmittag überprüft und festgestellt, dass:

„const“ oder den Kopierkonstruktor werden diese Fehler behoben entfernen.

Aber ich weiß nicht warum ... Kann mir jemand den Grund sagen, der diesen Fehler verursacht? oder vielleicht ist es ein GCC-Bug?

+2

Stellen Sie sicher, dass Sie den vorkompilierten Header neu erstellt haben, nachdem Sie 'FooClass.h' geändert haben. Klingt, als hätte die Diagnose einen kleinen Fehler aufgrund einer Desynchronisation zwischen dem realen Header und dem PCH. d. h., tue einen neuen Build und lass uns die Ergebnisse wissen. –

+2

Dies ist nicht das Problem, aber Namen, die zwei aufeinanderfolgende Unterstriche ('__FooClass__') und Namen enthalten, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen, sind für die Implementierung reserviert. Benutze sie nicht. –

+0

Ja, ich habe einen sauberen Build gemacht. Und ich entschuldige mich für den schlechten Code-Stil, aber ich versuche nur ein Minimum an Codes zu machen, die dieses Problem reproduzieren können, also ignoriere bitte den Code-Stil :-) –

Antwort

0

Das ist ein sehr seltsamer Fehler. Was passiert, wenn Sie den Operator inline einbinden:

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