编译错误Friend类无法访问字段

时间:2014-11-27 08:37:44

标签: c++ qt qt5 friend

我正在尝试编译QT5.3
有问题的文件是qv4executableallocator_p.h和qv4executableallocator.cpp。标题中的相关代码段位于

之下
 struct Allocation{
    Allocation()
    : addr(0)
    , size(0)
    , free(true)
    , next(0)
    , prev(0)
    {}
    void *start() const;
    void invalidate() { addr = 0; }
    bool isValid() const { return addr != 0; }
    void deallocate(ExecutableAllocator *allocator);
    private:
        ~Allocation() {}
        friend class ExecutableAllocator;
        Allocation *split(size_t dividingSize);
        bool mergeNext(ExecutableAllocator *allocator);
        bool mergePrevious(ExecutableAllocator *allocator);
        quintptr addr;
        uint size : 31; // More than 2GB of function code? nah :)
        uint free : 1;
        Allocation *next;
        Allocation *prev;
};  

在cpp函数ExecutableAllocator::ChunkOfPages::~ChunkOfPages()中,尝试访问alloc-> next时出现编译错误。

QV4::ExecutableAllocator::Allocation* QV4::ExecutableAllocator::Allocation::next’ is private

可以在https://qt.gitorious.org/qt/qtdeclarative/source/be6c91acc3ee5ebb8336b9e79df195662ac11788:src/qml/jsruntime

在线查看代码

我的gcc版本比较陈旧... 4.1
这是问题还是在我的环境中出现了其他问题。我希望有一种方法可以继续前进。我坚持使用这个编译器,因为它是我必须在目标平台上使用的那个

1 个答案:

答案 0 :(得分:1)

我猜测QV4::ExecutableAllocator::ChunkOfPages结构与Allocation没有直接结合,所以你不能在C +之前的C ++中的析构函数中访问Allocation的私有数据+11标准。

尝试将friend struct ExecutableAllocator::ChunkOfPages添加到Allocation定义中,这应该可以解决问题。

在C ++ 11中处理嵌套类的方式略有变化(引自cppreference.com):

  

在C ++ 11之前,类T的朋友的嵌套类中的成员声明和定义不能访问类T的私有成员和受保护成员,但是一些编译器甚至在前C ++ 11模式下也接受它。 / p>

这可以解释为什么这在新编译器中起作用,但在旧编译器中不起作用。