为什么.hpp文件中包含.h文件,反之亦然?

时间:2016-10-13 21:06:51

标签: c++ inheritance header include

似乎没有一个像样的谷歌这样的方式,所以这是我的问题:

.cpp文件包含.h文件。所以假设我有一个在range_search.h中定义的类,并在range_search.cpp中实现它。如果我想从另一个cpp文件中使用它,我再次包括range_search.h。无论如何,这似乎是正确的礼仪。但是这样,我没有在任何地方包含.cpp文件,目前我的代码抱怨没有找到其中的功能。我做错了什么?

最好,并提前感谢! 亚历

编辑:按照愿望:

range_search.h:

#ifndef RANGE_SEARCH_H_
#define RANGE_SEARCH_H_

namespace range_search {

template<class Point>
class RangeSearch {
 public:
    using value_type = Point;

    virtual void assign(const std::vector<Point>& points) = 0;  
};

}  // namespace range_search
#endif  // RANGE_SEARCH_H_

range_search.cpp:

#include "range_search.h"

namespace range_search {

    /// Sets the underlying set.
    void assign(const std::vector<Point>& points){
        //doing stuff
    }  
}

main.cpp中:

#include "range_search.h"

using Point = std::array<double, 2>;

int main(){

    //initialize some points
    range_search::RangeSearch<Point> r();
    r.assign(points);

}

遗憾的是,德语出现错误:

Fehler:Abfrage des Elementes»分配«in»r«,das vom Nicht-Klassentyp»range_search :: RangeSearch&gt;()«ist   r.assign(分);

据我所知,这是因为main.cpp没有链接到range_search.cpp

2 个答案:

答案 0 :(得分:0)

  

无论如何,这似乎是正确的礼仪。   这不是礼仪的问题,但.cpp文件被视为翻译单元,并由任何体面的编译器或构建系统处理。< / p>

.h个文件包含在其他翻译单元中使用时需要看到的所有声明。

编译的.cpp文件在最后的链接阶段被拼接在一起。

  

但是这样,我没有在任何地方包含.cpp文件,目前我的代码抱怨没有找到其中的功能。我做错了什么?

您可能错过了将生成的目标文件正确链接的最后一部分。

至于你的编辑:

您现在正在显示模板声明,这是一个更特殊的情况。编译器需要查看模板定义才能正确实例化它们。

您可以在此处详细了解详情:Why can templates only be implemented in the header file?

答案 1 :(得分:0)

这归结为C ++(和C)的构建方式。您的编译器会将.cpp文件编译为目标文件(通常为.o或.obj)。然后,链接器将多个目标文件链接到单个二进制文件(可执行文件或库)。

您的编译器(实际上是链接器)抱怨它无法找到您正在调用的函数的定义,因为这些目标文件未包含在链接中。或者从您的问题看来,如果没有实际错误很难说(将来,请确实包含实际的错误消息)。

我们包含.h文件,因此编译器可以看到各种事物(类,函数,有什么)的声明(通常不是定义)。如果您没有包含这些内容,编译器会抱怨这些标题中声明的内容未被声明,因此它不知道它们应该是什么。

我会试着写一些关于此的文档。目前,请检查编译器/ IDE的文档。他们应该有关于链接多个目标文件的信息。