Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译问题-typedef、转发声明、名称空间?_C++_Compilation_Typedef - Fatal编程技术网

C++ 编译问题-typedef、转发声明、名称空间?

C++ 编译问题-typedef、转发声明、名称空间?,c++,compilation,typedef,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.

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

我不确定我是否能完全解释这个问题,因为我不完全理解它。。。但我要展示一下这里发生了什么:

库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文件中的事实?

这可能会帮助您:

a、 h:

c、 h:

main.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;
}

。。。对我来说很好;)

这可能会帮助您:

a、 h:

c、 h:

main.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;
}

。。。对我来说很好;)

转发声明更像

namespace CF { class B; }
编译器不能从
CF::B
中提取任何内容,除非它已经知道CF是一个名称空间


您也不能向前声明typedef,因为编译器必须知道B是类还是内置类型。一些内置类型具有特殊规则,如
char*
void*

转发声明更像

namespace CF { class B; }
编译器不能从
CF::B
中提取任何内容,除非它已经知道CF是一个名称空间


您也不能向前声明typedef,因为编译器必须知道B是类还是内置类型。一些内置类型有特殊规则,如
char*
void*

头文件是否有适当的包含保护?是的,它们都有标准的包含保护(#ifndef#define#endif)。如何从另一个文件转发声明typedef,以便头文件中没有依赖项?这可能是很好的第一步。头文件是否有适当的包含保护?是的,它们都有标准的包含保护(#ifndef#define#endif)。如何从另一个文件转发声明typedef,以便头文件中没有依赖项?这可能是很好的第一步。我认为
CF::B
是一个typedef而不是一个类定义这一事实对于这个问题是至关重要的…+1感谢您的帮助-我会像您所指出的那样更加关注名称空间:)我认为
CF::B
是一个typedef而不是一个类定义这一事实对于问题…+1并感谢您的帮助-我将更加关注您指出的名称空间:)这不是一个完整的解决方案,但它将构建推进了一点,因此我们正在取得更大的进展-因此我认为这绝对是最好的,我会得到草率的问题:)非常感谢您的帮助+1.这不是一个完整的解决方案,但它将构建推进了一点,因此我们正在取得更大的进展-因此,我认为这绝对是最好的解决方案,因为有一个草率的问题:)非常感谢您的帮助+1.