2013-08-06 18 views
5

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?

+2

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

+2

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 –

+0

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

risposta

0

Questo è un errore molto strano. Verificare cosa succede se si esegue l'inline all'operatore:

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