前向声明和命名空间的关系

2023-05-16

问题描述

//a.hh

class B;
namespace test{
class A
{
public:
    A(B* b);
private:
    B* bb_;
};
}//end test

//a.cc
#include "a.hh"
#include "b.hh"

namespace test{
A::A(B* b) // 这里会报错
: bb_(b)
{
}
}// end test

//b.hh
namespace test{
class B
{
int some;
};
}//end test

报错原因是 cannot initialize a member subobject type B * with an lvalue of type test::B *

原因在于前向声明没有放到namespace test中去。
我们会默认为存在俩个类,一个是::B
一个是test::B

我们手动加上命名空间实际上是

//a.cc
#include "a.hh"
#include "b.hh"

namespace test{
A::A(test::B* b) // 这里会报错
: (::B)bb_(b)
{
}
}// end test

修改

就是在a.hh中,将前向声明B放到namespace test中去。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前向声明和命名空间的关系 的相关文章

随机推荐