esms.cpp: 234: ошибка: «the_config» не был объявлен в этой области - PullRequest
0 голосов
/ 06 мая 2011

Я пытаюсь скомпилировать некоторые файлы .cpp из старого проекта с открытым исходным кодом, который больше не имеет сообщества поддержки. В проекте около 15 .cpp файлов, и некоторые из них используют один общий файл с именем config.cpp. Я компилирую исходный код на C ++, используя make-файл, который запускает такую ​​команду:

g ++ -g -c -Wall -педантик -ansi esms.cpp

Однако это дает мне несколько ошибок, подобных этой: esms.cpp: 234: ошибка: «the_config» не был объявлен в этой области

Я проверил файл esms.cpp, и он содержит следующее:

#include "game.h"
#include "config.h"
#include "tactics.h"
#include "report_event.h"
#include "teamsheet_reader.h"
#include "cond.h"
#include "util.h"
#include "mt.h"
#include "anyoption.h"
#include "cond_utils.h"
#include "config.h"
#include "comment.h"

Я также проверил файл config.h и нашел в нем следующее:

class config
{
public:
  void load_config_file(string filename);
  string get_config_value(string key);
  void set_config_value(string key, string value);
  int get_int_config(string key, int dflt);

friend config& the_config(void);

private:
  config()
  {}
  config(const config& rhs);
  config& operator= (const config& rhs);

map<string, string> config_map;
};

Затем я проверил файл config.cpp и нашел объявление для the_config:

#include <cstdio>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cctype>
#include "config.h"
#include "util.h"


// get a reference to a static config (a singleton)

config& the_config(void)
{
    static config tcfg;
    return tcfg;

}

Таким образом, «the_config» определен в файлах config.h и config.cpp, но по какой-то причине файл esms.cpp не считает, что это объявлено. Я попытался переместить метод в файл esms.cpp и удалить его из файла config.cpp, но затем другие файлы cpp, которые зависят от файла config.cpp, начали получать ошибки.

Как заставить файл esms.cpp распознать, что "the_config" определен в config.cpp для исправления ошибки области?

Спасибо за вашу помощь! Надеюсь, этот вопрос имеет смысл, я только начинаю с C ++

1 Ответ

1 голос
/ 06 мая 2011

Функция the_config - это , а не , действительно объявленная в config.h. Без объявления esms.cpp не знает, что такое the_config, поэтому компилятор генерирует ошибку.

У вас do есть объявление друга the_config внутри config определения класса, но это объявление друга не создает "обычного" объявления the_config. Приведенное выше объявление друга the_config просто ссылается на функцию из охватывающей области (в данном случае - глобальной области), но не вводит объявление в глобальной области.

Вы должны сделать это объявление явно, то есть вы должны добавить

config& the_config(void);

вне определения класса в config.h.


Как заставить файл esms.cpp распознавать, что "the_config" определен в config.cpp

Вы не можете. Компилятор C ++ (в узком смысле этого слова, то есть «компилятор», а не «компоновщик») видит каждую единицу перевода независимо, что означает, что esms.cpp не знает и не заботится о config.cpp. Единственный способ заставить esms.cpp узнать о the_config - это ввести объявление the_config в esms.cpp. Обычно это делается с помощью заголовочного файла. В вашем случае это будет config.h. Вам нужно исправить config.h, как показано выше.

...