复制构造函数与 pch 中的 const 成员函数冲突?gcc 错误?

Copy constructor conflicts with const member function in pch? A gcc bug?

提问人:Lendy Zhang 提问时间:8/6/2013 最后编辑:Lendy Zhang 更新时间:4/5/2015 访问量:445

问:

我是 gcc 的新手,在 gcc-4.7.2/4.7.3 中编译预编译标头时遇到了一个非常奇怪的问题。

代码如下:

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

我检查了一整个下午,发现:

删除“const”或复制构造函数将解决这些错误。

但我不知道为什么......有人可以告诉我导致此错误的原因吗?或者也许是 GCC 错误?

C++ GCC 常量 复制构造函数 PCH

评论

2赞 Lightness Races in Orbit 8/6/2013
请确保在更改 后重新创建了预编译标头。听起来由于实际标头和 PCH 之间的不同步,诊断程序有一个轻微的错误。即进行全新构建并让我们知道结果。FooClass.h
2赞 Pete Becker 8/6/2013
这不是问题所在,但包含两个连续下划线 () 的名称和以下划线开头后跟大写字母的名称将保留给实现。不要使用它们。__FooClass__
0赞 Lendy Zhang 8/6/2013
是的,我确实做了一个干净的构建。我很抱歉代码风格不好,但我只是想制作一段可以重现这个问题的最小代码,所以请忽略代码风格:-)
0赞 8/6/2013
虽然与你的错误无关,但你应该非常非常小心你所使用的“成语”,即包含 .如果需要访问 的组件,则应进行显式加载和存储,因为这样做可能无法保证正确性。欲了解更多信息,stackoverflow.com/questions/9241721/...__m128__m128
0赞 Joe Z 8/6/2013
我刚刚在本地逐字尝试了您的示例,在 G++ 4.4.4 和 4.8.0 中没有错误。但是,它在 G++ 4.6.0 中失败了。我怀疑这实际上是一个 G++ 问题。

答:

0赞 Mel Viso Martinez 4/5/2015 #1

这是一个非常奇怪的错误。测试如果内联运算符会发生什么情况:

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