似乎没有一个像样的谷歌这样的方式,所以这是我的问题:
.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
答案 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的文档。他们应该有关于链接多个目标文件的信息。