2010-04-27 145 views
0

我得到了一个编译错误,我不明白。 我有一个h/cpp文件组合,不包含类,但只是定义了一些实用功能。当我尝试使用在其他类中定义的结构我得到的错误:C++编译错误

错误C2027:使用未定义的类型的“B :: C”

因此,剥离下来的问题,H-文件看起来像这样

namespace A { 
    void foo(B::C::SStruct const & Var); 
} 

SStruct的定义是在另一个h文件中的类中,当然也包含它。

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; 
} 

奇怪的是,我可以在其他类中使用这个结构精细,它只是似乎是与此相关的H-文件,该文件只包含实用功能。 我在这里错过了什么? 谢谢!

回答

5

修正缺少分号等在此之后编译:

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; 
} 
namespace A { 
    void foo(B::C::SStruct const & Var); 
} 

显然,如果两个命名空间的顺序进行切换,这是行不通的。可能你是#错误的顺序包括你的标题。如果这是错误,那就是糟糕的设计 - 你不应该让头部顺序在代码中起作用。

+0

谢谢。对不起,我忘了在我原来的帖子中提到这个,它实际上是公开的。 – clamp 2010-04-27 15:47:02

+0

是的,它似乎是顺序。谢谢!我将需要重新考虑我的h文件的组织结构。 – clamp 2010-04-27 16:03:33

0

我假设你的意思是“C类”,而不是“C类”。

struct SStruct对C类是私有的(私有是类成员的默认可见性)。

因此,它不在C类及其朋友之外,它不包括A :: foo()。

+0

谢谢。对不起,我忘了在我原来的帖子中提到这个,它实际上是公开的。 – clamp 2010-04-27 15:46:25

0
Class C { 
     struct SStruct { }; 
    } 

==>

class C { 
public: 
     struct SStruct { }; 
    }; 
+0

谢谢。对不起,我忘了在我原来的帖子中提到这个,它实际上是公开的。 – clamp 2010-04-27 15:45:52

0

你的类缺少定义后一个分号。应该是:

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; // <=== Here 
} 
+0

是的,谢谢,但这不是问题 – clamp 2010-04-27 15:50:25