Требуется оператор включения C ++ при определении карты в заголовочном файле - PullRequest
2 голосов
/ 29 марта 2010

Я делал проект для компьютерного курса по понятиям программирования. Этот проект должен был быть выполнен на C ++ с использованием объектно-ориентированных проектов, которые мы изучали на протяжении всего курса. Во всяком случае, у меня есть два файла symboltable.h и symboltable.cpp. Я хочу использовать карту в качестве структуры данных, поэтому я определяю ее в закрытом разделе заголовочного файла. Я #include <map> в файле cpp, прежде чем я #include "symboltable.h".

Я получаю несколько ошибок от компилятора (MS VS 2008 Pro), когда иду отлаживать / запускать программу, первая из которых:

Error   1   error C2146: syntax error : missing ';' before identifier 'table'   c:\users\jsmith\documents\visual studio 2008\projects\project2\project2\symboltable.h   22  Project2

Чтобы это исправить, мне нужно было #include <map> в заголовочном файле, что мне кажется странным.

Вот соответствующие файлы кодов:

// symboltable.h
#include <map>

class SymbolTable {
    public:
        SymbolTable() {}
        void insert(string variable, double value);
        double lookUp(string variable);
        void init(); // Added as part of the spec given in the conference area.
    private:
        map<string, double> table; // Our container for variables and their values. 
};

и

// symboltable.cpp
#include <map>
#include <string>
#include <iostream>
using namespace std;

#include "symboltable.h"

void SymbolTable::insert(string variable, double value) {
    table[variable] = value; // Creates a new map entry, if variable name already exist it overwrites last value.
}

double SymbolTable::lookUp(string variable) {
    if(table.find(variable) == table.end()) // Search for the variable, find() returns a position, if thats the end then we didnt find it.
        throw exception("Error: Uninitialized variable");
    else
        return table[variable];
}

void SymbolTable::init() { 
    table.clear(); // Clears the map, removes all elements.
} 

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

Я предполагаю, что у вас есть другой файл, включающий заголовочный файл #include "symboltable.h". И этот другой исходный файл не #include <map>, #include <string> и using namespace std, прежде чем он включает "symboltable.h".

Проверьте, какой файл компилируется при появлении ошибки . Это может быть другой исходный файл, чем .cpp, который вы упомянули? Возможно что-то вроде main.cpp?

Еще один способ решить вашу проблему - поместить нужные заголовки в заголовочный файл и использовать std::map вместо простого map. Также вы используете string, который также находится внутри пространства имен std. Так что это должно быть std::string. И положить недостающий #include <string>.

0 голосов
/ 29 марта 2010

Да, вам действительно нужно #include <map> в заголовочном файле.

Вы используете map в объявлении класса, поэтому компилятору необходимо знать, на что ссылается map. Поскольку его определение в <map>, вам необходимо включить этот заголовок перед использованием map шаблона класса.

Вы можете также вместо #include <map> в каждом исходном файле перед строкой #include "symboltable.h", но обычно вы просто включаете эти предварительные условия в заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...