我已经在http://www.cplusplus.com/forum/general/96128/上问了这个问题,但无济于事。

有没有人遇到过与g++ 4.2相同的错误:internal compiler error: in make_thunk, at cp/method.c:129
我认为没有必要包含示例代码。相应的代码在其他几个较新的g++版本以及clang++上进行编译时不会发出警告和错误。这是完全正确的,并且该错误已在GCC的bugzilla中提到(甚至几次,因为它似乎经常重复出现),但未提供解决方法。

也请不要告诉您使用更新的g++。我必须在Ubuntu Hardy随附的g++上进行编译,因此无法更改编译器。主要开发是在Ubuntu Precise上完成的,但我需要使其与Hardy兼容。

我不知道应该是什么重击,我只是怀疑它与协变和/或多重继承有关。另外,我还有其他几个相似的结构化头文件,尽管唯一的变化是名称是类的名称,但由于Hardy上的编译器错误,我没有目的去更改这些结构化头文件。

另一个事实是,它发生在包含时间。

In file included from /home/heiko/hgl/src/compiler/compilerprojectfactory.cpp:18:
/home/heiko/hgl/src/compiler/compilertype.h: In instantiation of 'HGL::Compiler::CompilerType<HGL::Vector2D, HGL::Compiler::CompilerBase>':
/home/heiko/hgl/src/compiler/compilervector2d.h:23: instantiated from here
/home/heiko/hgl/src/compiler/compilertype.h:22: internal compiler error: in make_thunk, at cp/method.c:129
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
For Debian GNU/Linux specific bug reporting instructions,
see <URL:file:///usr/share/doc/gcc-4.2/README.Bug

编辑:这里导致错误的 header :
#include "compilertype.h"
#include "vector2d.h"

namespace HGL {

class Vector2D;

namespace Compiler {

/**
    @author Heiko Schäfer <[email protected]>
*/
class _LOCAL Vector2D : public Compiler::CompilerType<HGL::Vector2D> {
    DISALLOW_COPY_AND_ASSIGN(Vector2D)
public:
    Vector2D(float x, float y, int line);

    using IType::operator=;

    virtual operator HGL::Vector2D &() const throw(InvalidExpressionException);
protected:
    virtual ~Vector2D();

    void append(ISerializeable::BUFFER *dest, const HGL::IType *type) const;
};

}

}

这里是模板:
#include "compilerbase.h"
#include "iproject.h"
#include "util.h"

namespace HGL {

namespace Compiler {

const IProject::VSTRUCT minReq = { HGL_MINREQ_MAJOR, HGL_MINREQ_MAJOR, HGL_MINREQ_MAJOR };

template<class Type, class Base = CompilerBase>
class _LOCAL CompilerType : public Type, public Base {
    DISALLOW_COPY_AND_ASSIGN(CompilerType)
public:
    using IType::operator=;

    template<class Param>
    inline CompilerType(const Param &p, bool b, int line,
                        const IProject::VSTRUCT &vs = IProject::VSTRUCT()) :
        Type(p), Base(line, b) {
        init(vs);
    }

    template<class Param>
    inline CompilerType(const Param &p, int line,
                        const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(p), Base(line) {
        init(vs);
    }

    inline CompilerType(bool b, int line, const IProject::VSTRUCT &vs = IProject::VSTRUCT())
        : Type(), Base(line, b) {
        init(vs);
    }

    template<class Param1, class Param2>
    inline CompilerType(const Param1 &p1, const Param2 &p2, int line,
                        const IProject::VSTRUCT &vs = IProject::VSTRUCT()) :
        Type(p1, p2), Base(line) {
        init(vs);
    }

    template<class Param1, class Param2>
    inline CompilerType(const Param1 &p1, const Param2 &p2, bool b, int line,
                        const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(p1, p2),
        Base(line, b) {
        init(vs);
    }

    inline CompilerType(int line,
                        const IProject::VSTRUCT &vs = IProject::VSTRUCT()) : Type(), Base(line) {
        init(vs);
    }

    inline virtual void append(ISerializeable::BUFFER *dest, const IType *type) const {
        Base::append(dest, type);
    }

protected:
    inline virtual ~CompilerType() {}

    inline virtual void init(const IProject::VSTRUCT &vs) {
        const_cast<IProject::VSTRUCT &>(vs) = std::max(vs, minReq);
        CompilerBase::setMinRequiredVersion(vs, Type::getSerialID());
    }

};

}

}

已解决!

深入研究g++ 4.2的源代码后,我发现它现在需要完整树中的所有类型。 g++> 4.2显然不需要此。

因此,错误发生在一个相关类中,该类具有一个带有转发特化的模板成员。我只包含 header 而不是转发,而g++ 4.2很高兴。

否则,不给出错误,但这是无用的消息,确实是一个不错的错误。

最佳答案

重击或蹦床是在动态调度的某些实现中添加的一部分代码,用于相对于所使用的最终替代程序来适应基本虚拟功能的接口(interface)。正如您提到的,通常需要使this指针适应多重/虚拟继承(对于第一个非空对象之后列出的碱基),并使结果指针/引用具有协变返回类型。

该错误表明它是编译器错误。如果必须使用该特定的编译器,则需要解决此问题,这将涉及更改设计。您可以尝试限制多/虚拟继承的使用,重新排列列表中的基数,或尝试变通直到设法使编译器以某种方式消化该代码。如果为协变返回类型生成适配器时出现问题,请考虑删除协变返回并提供重载(使用其他名称),该重载将返回协变类型(即用返回最大的非虚函数替换协变返回)派生类型和调用前一个并返回对基的引用的虚函数)。

除了这些通用提示以外,在没有看到您拥有的代码和编译器的实现的情况下,无话可说。

关于c++ - g++ 4.2 : internal compiler error: in make_thunk, at cp/method.c:129,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15484466/

10-12 23:33