/*--------------------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.
Я не знаю, почему я получаю «Нет такого файла или каталога»!
Когда вы пишете:
#include <utilities.h>
Компилятор ищет utilities.h
по умолчанию включают пути или пути, которые указаны явно (например, в g ++ с -I
).
Ты можешь написать:
#include "utilities.h"
чтобы он сначала посмотрел на путь относительно исходного файла.
Вы включили 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
,
Книга не дает вам содержимое одного файла, она дает вам содержимое нескольких. Когда в списке говорится
/*--------------------utilities.cpp-------------------------------------*/
авторы имеют в виду «Поместите следующий код в файл» utilities.cpp «. Похоже, у вас нет этого файла. Сделайте это, и все это будет компилироваться.
Было ли это в книге или нет, в коде есть ошибка. Это
должно быть
#include "utilities.cpp"
а также
#include "utilities.h"
Обычно, когда вы используете <...>
Форма включения, компилятор
не будет искать файл в текущем каталоге. (Обычно вы можете
скажи это сделать, с опцией по линии /I.
или же -I.
, но
использование правильной формы включения является предпочтительным.)
+ Изменить
#include<utilities.cpp>
в
#include "utilities.cpp"
а также
#include<utilities.h>
в
#include "utilities.h"
Включение с <>
предназначен для «системных» заголовков. Я также предлагаю вам переименовать utilities.cpp
в utilities.ipp
, чтобы отличать исходные файлы, которые включены от тех, которые скомпилированы напрямую.