2011-10-10 119 views
3

我在Xcode一个Objective-C++项目,编译好于正常的构建方案时,但是当我编译归档,分析或简介我得到的编译错误:类类型范围

必须使用“类”标签指向型“行”在此范围

这是一个非常简化的版本我的代码:

class Document; 

class Line 
{ 
public: 
    Line(); 

private: 
    friend class Document; 
}; 

class Document 
{ 
public: 
    Document(); 

private: 
    friend class Line; 
}; 

的错误发生在任何地方我尝试使用型线。例如。

Line *l = new Line(); 

你知道如何解决此错误信息,为什么只在上面列出的方案之一编译时会出现?

+3

“编译其中文献的方法中实现的document.mm文件时发生的错误”但是你决定我们不需要看到它。 –

+0

好点,我会修改。 – CD1212

+0

你是否在实现文件中包含类定义? –

回答

1

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

2

这不回答你的问题,但看到因为这是没有答案与提供我只是提出这个意见的信息。而不必Document是朋友或LineLine是的Document的朋友,你可以有Document包含线,给我让更多的意义,似乎更好的封装。

class Line 
{ 
public: 
    Line(); 
}; 

class Document 
{ 
public: 
    Document(); 

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

我在我的代码有这个问题。在查看生成的预处理文件后,我发现我的类名与函数名相同。所以编译器试图通过在类型前添加类标签来解决歧义。

代码(有错误)之前:

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

同样的问题。我在一个节俭文件中犯了这个错误,生成的文件有编译错误。 – CCoder