/*--------------------utilities.h-------------------------------------*/
#ifndef UTILITIES_H
#define UTILITIES_H
template<class T> int compare(const T&,const T&);
#include<utilities.cpp>
#endif
/*--------------------utilities.cpp-------------------------------------*/
template<class T> int compare(const T &v1 , const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
/*--------------------main.cpp------------------------------------------*/
#include<iostream>
#include<utilities.h>
using namespace std;
int main(int argc , char *argv[])
{
cout << compare(1,2) << endl;
return 0;
}
上面的代码是书中的一个例子。但是,当我编译这三个文件时它会出错:
utilities.h:6:24: fatal error: utilities.cpp: No such file or directory
compilation terminated.
main.cpp:2:22: fatal error: utilities.h: No such file or directory
compilation terminated.
我不知道为什么我得到“没有这样的文件或目录”!
最佳答案
问题1
当你写的时候:
#include <utilities.h>
编译器在默认包含路径或明确指定的路径中查找 utilities.h
(例如,在带有 -I
的 g++ 中)。
你可以这样写:
#include "utilities.h"
让它首先查看相对于源文件的路径。
问题2
您在头文件中包含了 utilities.cpp
(也存在与上述相同的问题)。不推荐这样做,但严格来说也不是错误的。然而,在那种情况下,该文件的内容已经编译并包含在 main.o
中,因此您实际上不需要编译和链接这两个目标文件,而只需 main.cpp
就够了。
编写模板的推荐方法是将所有内容都写在头文件中(我知道,这并不好):
/*--------------------utilities.h-------------------------------------*/
#ifndef UTILITIES_H
#define UTILITIES_H
template<class T>
static inline int compare(const T &v1, const T &v2);
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
#endif
/*--------------------main.cpp------------------------------------------*/
#include <iostream>
#include "utilities.h"
using namespace std;
int main(int argc , char *argv[])
{
cout << compare(1,2) << endl;
return 0;
}
您只需编译 main.cpp
。
关于c++ - c++中的包含编译模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278266/