微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果使用嵌套命名空间,如何转发声明 C++ 结构?

如何解决如果使用嵌套命名空间,如何转发声明 C++ 结构?

我有以下 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 举报,一经查实,本站将立刻删除。