我试图在方法声明中使用构造函数作为默认值,如下所示:
A.hpp
#include "B.hpp"
class B;
Class A {
friend class B;
public:
A();
~A();
const A& operator = (const A& rhs) {
// assignment operations
return *this;
}
int do_something (B* pB);
};
B.hpp
#include "A.hpp"
class B {
public:
B(const A a = A());
~B();
};
我的gcc 4.8 C ++ 11编译器对行B(const A a = A());
不满意:
错误:' A'没有命名类型错误:ISO C ++禁止声明' A'没有类型[-fpermissive]
我需要一个默认值,我不想使用B(A *a = NULL, int z = 0);
中的指针。
我还尝试声明一个静态元素并将此对象用作默认值:
A.hpp
#include "B.hpp"
class B;
class A {
// ...
};
B.hpp
#include "A.hpp"
A a0;
class B {
public:
B(const A a = a0);
~B();
};
我得到完全相同的错误。
我怎样才能实现这一目标?
编辑:使代码更接近真实代码。
答案 0 :(得分:4)
你必须在类的右大括号后添加分号。
class A class A
{ {
} /* bad */ }; /* good */
答案 1 :(得分:1)
将静态变量声明a0
移动到A类的定义之后,如下所示:
class A
{
// class definition
};
A a0;
class B
{
B (const A a = a0);
};
答案 2 :(得分:1)
我终于找到了问题的根源,这是由于#include
的使用不当。
删除A.hpp中的行#include "B.hpp"
可以解决问题。 A头只需要B类的前向声明,因为它只使用指向该类的指针。我总结说我有一个循环标题引用。我认为使用friend
需要包含类的标题。注意:B类实际上需要访问A类的一些私有成员。
对不起,我的初始帖子很糟糕,不可能从中诊断任何东西,因为它与真实的一个(coorected)不够接近。我下次会坚持使用SSCCE。感谢大家。随着好友总结here,"这真是愚蠢的"。然后我找到了详细解释here和here。
答案 3 :(得分:1)