2013-08-06 15 views
5

Jestem nowy w gcc i napotykam na naprawdę dziwny problem podczas kompilowania prekompilowanych nagłówków w gcc-4.7.2/4.7.3.Kopiowanie konfliktów konstruktora z funkcją składową const w pch? Błąd gcc?

Poniższe odnośniki:

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

zestawione jako PCH:

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 

wygeneruje błędów:

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

Sprawdziłem na całe popołudnie, i stwierdził, że:

Usuwanie „const” lub konstruktora kopia zostanie rozwiązany tych błędów.

Ale nie wiem dlaczego ... Czy ktoś może mi podać przyczynę tego błędu? a może jest to błąd gcc?

+2

Po zmianie "FooClass.h" po odtworzeniu prekompilowanego nagłówka. Wygląda na to, że diagnostyka ma niewielki błąd z powodu desynchronizacji pomiędzy rzeczywistym nagłówkiem i PCH. tj. zrobić nową kompilację i poinformować nas o wynikach. –

+2

To nie jest problem, ale nazwy zawierające dwa następujące po sobie podkreślenia ('__FooClass__') i nazwy zaczynające się znakiem podkreślenia, po którym następuje duża litera, są zarezerwowane dla implementacji. Nie używaj ich. –

+0

Tak, zrobiłem czystą kompilację. Przykro mi z powodu złego stylu kodowania, ale próbuję stworzyć minimum kodów, które mogą odtworzyć ten problem, więc zignoruj ​​styl kodu :-) –

Odpowiedz

0

To bardzo dziwny błąd. Sprawdź, co się dzieje, jeśli uruchomisz operatora: