我在Xcode中有一个Objective-C ++项目,它在正常的构建方案上编译得很好,但是当我为Archive,Analyze或Profile编译时,我得到了编译错误:
必须使用'class'标记来引用此范围内的'Line'类型
这是我的代码的简化版本:
class Document;
class Line
{
public:
Line();
private:
friend class Document;
};
class Document
{
public:
Document();
private:
friend class Line;
};
错误发生在我尝试使用Line类型的任何地方。例如
Line *l = new Line();
您是否知道如何解决此错误消息以及为何仅在编译上面列出的方案之一时才会出现?
答案 0 :(得分:7)
我的代码中遇到了这个问题。在查看生成的预处理文件后,我发现我的一个类名与函数名相同。因此编译器试图通过要求在类型前面添加类标记来解决歧义。
在代码之前(有错误):
template <typename V>
void Transform(V &slf, const Transform &transform){ // No problem
//... stuff here ...
}
void Transform(V2 &slf, const Transform &transform); // Error: Asking to fix this
void Transform(V2 &slf, const class Transform &transform); // Fine
//Calling like
Transform(global_rect, transform_);
代码后:
template <typename V>
void ApplyTransform(V &slf, const Transform &transform){ // No problem
//... stuff here ...
}
void ApplyTransform(V2 &slf, const Transform &transform);
//Calling like
ApplyTransform(global_rect, transform_);
答案 1 :(得分:3)
这不能回答你的问题,但是因为提供的信息无法回答我只会提出这个建议。不要让Document
成为朋友,或Line
和Line
成为Document
的朋友,您可以Document
包含对我来说更有意义的行并且似乎更好地封装了。
class Line
{
public:
Line();
};
class Document
{
public:
Document();
private:
std::vector<Line> m_lines;
};
答案 2 :(得分:0)
我设法通过重构&#39; Line&#39;来解决问题。将名称输入其他内容。我能想到的唯一解释是,在执行和存档构建时,Xcode在一些外部源中编译,这些外部源定义了另一个&#39; Line&#39;类型。因此它需要&#39;班级&#39;说明者澄清类型。