c++ - 编译问题——类型定义、前向声明、 namespace ?

标签 c++ compilation typedef

我正试图帮助同事编译一些东西 - 本质上,他试图减少我们需要从更大的软件系统制作的小型可执行文件的依赖性。

我不确定我是否可以完全解释这个问题,因为我不完全理解它......但我将展示这里发生的事情:

库 A: 文件:A.h

namespace CF {
    typedef sometype B;
};

库 C: 文件 C.h

//Forward declare Class
class CF::B;

Class D {
    public:
        B* UseB();
};

库 C: 文件 C.cpp

#include "C.h"
#include "A.h"
using CF::B;

B* D::UseB()
{
    return new B;
}

抱歉,我知道这看起来有点疯狂,但我已尝试从我们实际处理的文件集中简化它。

我们通常会在 CF::B 上遇到多重定义错误,或者当我们使用代码并对其进行更改时,有时在 CPP 文件中它无法识别 CF::B 的类型。

我想我的第一个问题是......我可以像我们尝试过的那样转发声明 typedef 吗,或者是否有其他方法来处理 B 是 CF 命名空间中的 typedef 的事实,而我们不想直接包含在C.h文件中?

最佳答案

这可能对您有帮助:

嗯:

#ifndef NAMESPACE_A
#define NAMESPACE_A

namespace A
{
    class B
    {
        public: int i;
    };
}
#endif

c.h:

#ifndef NAMESPACE_A
#define NAMESPACE_A
namespace A
{
    class B;
}
#endif

class D
{
    public:
        A::B* UseB();
};

主要.cpp:

#include "a.h"
#include "c.h"
using A::B;

B* D::UseB()
{
    return new B();
}

int main(int argc, char* argv[])
{
    D* d = new D();
    B* b = d->UseB();
    b->i = 1;
    return 0;
}

...对我来说很好用 ;)

关于c++ - 编译问题——类型定义、前向声明、 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008726/

相关文章:

c++ - 如何打印指针字符数组

c++ - 链表说;不见了……但它不是

c++ - 无法为Raspberry PI零w交叉编译Qt 5.14.2,因为它是 “requires a C++11 compiler”

c++ - 在 C/C++ 中使用 `typedef` 的暗角?

swift - 在 Swift 中调用自定义闭包

c++ - scanf ("%d %d", &a, &b) == 2 是什么意思?

c# - 使用out参数从c#调用 native c++代码

c++ - 继承中的对象比较

java - Ant <javac> 由于 "package javax.servlet does not exist"而失败

c++ - 什么是 typedef int var[1];做?