类类型作用域

4

我在Xcode中有一个Objective-C++项目,在正常的构建方案下编译没有问题,但是当我编译存档、分析或者性能测试时,出现了以下编译错误:

必须使用'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();

您知道如何修复此错误消息以及为什么它只在上面列出的某个方案中编译时才出现吗?


3
“编译Document.mm文件时出现错误,该文件实现了Document类的方法。”但您决定我们不需要看到它。 - Lightness Races in Orbit
你是否在实现文件中包含了类定义? - Kerrek SB
是的。它似乎知道类型是什么,只是出于某种原因每次都要我在前面声明类。 - cdyer
3个回答

12

我的代码出了问题。在查看生成的预处理文件后,我发现我的一个类名与函数名相同。因此编译器试图通过要求在类型前添加class标记来解决歧义。

错误代码如下:

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_);

2
当您将结构体/类成员命名为与结构体/类名称相同时,会出现同样的问题。我在一个Thrift文件中犯了这个错误,生成的文件有编译错误。 - CCoder
2
如果在枚举中有一个类名。 - adam.baker

3
这并不能回答你的问题,但是考虑到提供的信息无法回答,我只好提出这个建议。不要让Document成为Line的友元类,也不要让Line成为Document的友元类,而是让Document包含多行内容,这样更有意义,看起来封装性更好。
class Line
{
public:
    Line();
};

class Document
{
public:
    Document();

private:
    std::vector<Line> m_lines;
};

0

我通过将“Line”类型名称重构为其他内容来解决了这个问题。我能想到的唯一解释是,在执行归档构建时,Xcode编译了一些外部源代码,其中定义了另一个“Line”类型。因此,它需要“class”说明符来澄清类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接