我正在尝试编译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
在线查看代码
我的gcc版本比较陈旧... 4.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>
这可以解释为什么这在新编译器中起作用,但在旧编译器中不起作用。