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

上記のコードは本の例です。ただし、3 つのファイルをコンパイルするとエラーが発生します。

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++ with -I) を探します。

あなたは書ける:

#include "utilities.h"

最初にソースファイルへの相対パスを調べるようにします。

問題 2

ヘッダー ファイルにインクルードutilities.cppしました (上記と同じ問題もあります)。これは推奨されませんが、厳密に間違っているわけではありません。ただし、その場合、そのファイルの内容は既にコンパイルされて に含まれているmain.oため、実際には 2 つのオブジェクト ファイルをコンパイルしてリンクする必要はなく、それだけ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です。

于 2012-09-05T09:34:39.633 に答える
1

この本は 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.cpp名前をに変更することもお勧めします。utilities.ipp

于 2012-09-05T09:33:50.243 に答える
1

本にあったかどうかにかかわらず、コードにエラーがあります。そのはず

#include "utilities.cpp"

#include "utilities.h"

通常、<...>インクルードの形式を使用すると、コンパイラは現在のディレクトリでファイルを検索しません。/I.(通常は、またはの行に沿ったオプションを-I.使用して、そうするように指示できますが、正しい形式のインクルードを使用することをお勧めします。)

于 2012-09-05T09:34:27.273 に答える