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?
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. –
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. –
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 :-) –