2013-08-06 39 views
5

我是gcc的新手,在編譯gcc-4.7.2/4.7.3中的預編譯頭文件時遇到了一個非常奇怪的問題。複製構造函數與pch中的const成員函數衝突?一個gcc的錯誤?

下面的碼:

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

編譯成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 

將生成錯誤:

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

我已經檢查過了整整一個下午,發現:

刪除「常量」或拷貝構造函數會解決這些錯誤。

但我不知道爲什麼...有人可以告訴我導致此錯誤的原因嗎?或者它可能是gcc的錯誤?

+2

確保在更改了'FooClass.h'後重新創建了預編譯頭。聽起來像診斷有一個輕微的錯誤,由於真正的標題和PCH之間的異步。即_新建一個_並讓我們知道結果。 –

+2

這不是問題,但包含兩個連續下劃線('__FooClass__')的名稱和以下劃線開頭並帶有大寫字母的名稱保留給實現。不要使用它們。 –

+0

是的,我做了一個乾淨的構建。並且我對不好的代碼風格感到抱歉,但是我只是想製作一個可以重現此問題的最小代碼,所以請忽略代碼風格:-) –

回答

0

這是一個非常奇怪的錯誤。測試如果內聯運算符會發生什麼情況:

FooClass operator -(void) const 
{ 
    return FooClass(); 
} 
相關問題