0
/*--------------------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.

我不知道为什么我得到“没有这样的文件或目录”!

4

4 回答 4

2

问题 1

当你写:

#include <utilities.h>

编译器utilities.h在它的默认包含路径中查找或明确指定的路径(例如在 g++ 中带有-I)。

你可以写:

#include "utilities.h"

使其首先查看相对于源文件的路径。

问题 2

您已包含utilities.cpp在头文件中(也存在与上述相同的问题)。不建议这样做,但并非完全错误。但是,在这种情况下,该文件的内容已经被编译并包含main.omain.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.

于 2012-09-05T09:34:39.633 回答
1

这本书不是给你一个文件的内容,而是给你几个文件的内容。当清单说

/*--------------------utilities.cpp-------------------------------------*/

作者的意思是“将以下代码放入文件 `utilities.cpp”。看起来你还没有那个文件。这样做,它将全部编译。

于 2012-09-05T09:30:53.757 回答
1

改变

#include<utilities.cpp>

#include "utilities.cpp"

#include<utilities.h>

#include "utilities.h"

包含<>用于“系统”标头。我还建议您重命名utilities.cpputilities.ipp, 以区分包含的源文件和直接编译的源文件。

于 2012-09-05T09:33:50.243 回答
1

不管它是否在书中,代码中都有错误。它应该是

#include "utilities.cpp"

#include "utilities.h"

通常,当你使用包含的<...>形式时,编译器不会在当前目录中查找文件。/I.(您通常可以使用类似or的选项告诉它这样做-I.,但最好使用正确的 include 形式。)

于 2012-09-05T09:34:27.273 回答