Sono nuovo di gcc e sto riscontrando un problema davvero strano durante la compilazione dell'intestazione precompilata in gcc-4.7.2/4.7.3.Il costruttore della copia è in conflitto con la funzione membro const in pch? Un bug gcc?
I codici indicati
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();
}
compilato come 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
genereranno errori:
./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
Ho controllato per un intero pomeriggio, e ha scoperto che:
Rimozione "const" o il costruttore di copia sarà risolto questi errori.
Ma non so perché ... Qualcuno può dirmi il motivo che causa questo errore? o forse è un bug gcc?
Assicurarsi di aver ricreato l'intestazione precompilata dopo aver modificato 'FooClass.h'. Sembra che la diagnostica abbia un leggero bug a causa di una desincronizzazione tra l'intestazione reale e il PCH. cioè una nuova build_ e facci sapere i risultati. –
Questo non è un problema, ma i nomi che contengono due caratteri di sottolineatura consecutivi ('__FooClass__') e nomi che iniziano con un trattino basso seguito da una lettera maiuscola sono riservati all'implementazione. Non li usano –
Sì, ho creato una build pulita. E mi dispiace per lo stile di codice errato, ma sto solo cercando di creare un codice minimo di codici in grado di riprodurre questo problema, quindi per favore ignora lo stile del codice :-) –