如何解决如果使用嵌套命名空间,如何转发声明 C++ 结构?
啊
namespace x {
namespace y {
namespace z {
struct Container;
class A
{
public:
A(Container& _container);
void info();
private:
Container& container;
};
}
}
}
A.cpp
#include "A.h"
#include <iostream>
namespace x {
namespace y {
namespace z {
A::A(Container& _container) : container(_container) {}
void A::info() {
std::cout << "Instance of A!" << std::endl;
}
}
}
}
容器.h
#include "A.h"
namespace x {
namespace y {
namespace z {
struct Container {
Container(): a(*this) {}
A a;
};
}
}
}
main.cpp
#include <cstdlib>
#include "Container.h"
int main(int argc,char** argv) {
x::y::z::Container container;
container.a.info();
return 0;
}
上面提到的代码是可编译和可用的。
但是假设我将 Container.h
移出 z
namespace
并将其放入 y
namespace
(嵌套在 {{1} } x
)。所以代码看起来像这样
啊
namespace
A.cpp
namespace x {
namespace y {
namespace z {
struct Container;
class A
{
public:
A(x::y::Container& _container);
void info();
private:
x::y::Container& container;
};
}
}
}
容器.h
#include "A.h"
#include <iostream>
namespace x {
namespace y {
namespace z {
A::A(x::y::Container& _container) : container(_container) {}
void A::info() {
std::cout << "Instance of A!" << std::endl;
}
}
}
}
main.cpp
#include "A.h"
namespace x {
namespace y {
struct Container {
Container(): a(*this) {}
x::y::z::A a;
};
}
}
#include <cstdlib>
#include "Container.h"
int main(int argc,char** argv) {
x::y::Container container;
container.a.info();
return 0;
}
如果我将 In file included from A.cpp:7:
A.h:26:22: error: expected ')' before '&' token
26 | A(x::y::Container& _container);
| ~ ^
| )
A.h:31:11: error: 'Container' in namespace 'x::y' does not name a type
31 | x::y::Container& container;
| ^~~~~~~~~
A.cpp:14:5: error: expected constructor,destructor,or type conversion before '(' token
14 | A::A(x::y::Container& _container) : container(_container)
| ^
从 Container.h
z
移到 namespace
y
嵌套在 namespace
x
?
解决方法
问题是您从未在 A.h. 中声明 x::y::Container
。您确实声明了 x::y::z::Container
,但这并未命名相同的类型。只需将声明移动到 y
命名空间:
namespace y {
namespace z {
struct Container;
进入->
namespace y {
struct Container;
namespace z {
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。