如何在不同的命名空间中声明struct定义?

时间:2015-10-15 13:04:21

标签: c++ struct namespaces

我在使用我在不同命名空间中声明的结构时遇到了麻烦。在File1.h中,我声明了结构并将其放在命名空间“Foo”中。

//File1.h
namespace Foo{
    struct DeviceAddress;
}

struct DeviceAddress {
    uint8_t systemID;
    uint8_t deviceID;
    uint8_t componentID;
};

在File2.c中,我尝试创建该结构的实例:

//File2.c
#include "File1.h"
struct Foo::DeviceAddress bar;

但是我在File2.c中遇到错误,我尝试声明结构。错误消息是: 错误C2079:'bar'使用未定义的struct'Foo :: DeviceAddress'

我正在使用MS C ++编译器和Visual Studio作为开发环境。

我是否在尝试声明'bar'时出现某种语法错误,或者我不了解有关命名空间或结构的内容?

2 个答案:

答案 0 :(得分:3)

问题在于struct定义:它也需要在命名空间中定义:

namespace Foo {
    struct DeviceAddress {
        uint8_t systemID;
        uint8_t deviceID;
        uint8_t componentID;
    };
}

您目前正在全局命名空间中定义一个单独的Foo

答案 1 :(得分:2)

DeviceAddress中的两个File1.h 不是相同的struct :一个位于名称空间Foo内,另一个位于全局名称空间中。

当您定义名称空间内的结构时,您必须提及其名称空间:

struct Foo::DeviceAddress {
    uint8_t systemID;
    uint8_t deviceID;
    uint8_t componentID;
};

或者只是同时声明和定义它,这是推荐的方式:

namespace Foo{
    struct DeviceAddress {
        uint8_t systemID;
        uint8_t deviceID;
        uint8_t componentID;
    };
}