2012-05-22 3 views
0

Я пытаюсь реализовать отображение из C++ STL следующим образом:C ошибка ++: не жизнеспособны преобразование из «mapped_type» до «межд»

#include <string> 
#include <iostream> 
#include <map> 
using namespace std; 
#include "assembler.h" 

// This Class makes use of the Map Template from the Standart Template Library 
// All addresses are stored as numerical (Dec) integers 

SymbolTable::SymbolTable() { // Constructor 
    map <string, int> symbolTable; 
    int address = 0; 
} 

void SymbolTable::addEntry(string symbol, int address) { 
symbolTable[symbol] = address; 
address++; 
} 

// Returns true if symbolTable already contains symbol 
bool SymbolTable::contains(string symbol) { 
    if (symbolTable.find(symbol) == symbolTable.end()) { return true; } 
    else { return false; } 
} 

int SymbolTable::getAddress(string symbol) { 
    return symbolTable[symbol]; 
} 

Я пытаюсь скомпилировать это с

c++ *.cpp -0 assembler.out 

и я получаю следующее сообщение об ошибке:

symboltable.cpp:57:9: error: no viable conversion from 'mapped_type' (aka 'std::basic_string<char>') to 'int' 
    return symbolTable[symbol]; 
      ^~~~~~~~~~~~~~~~~~~ 
1 error generated. 

Я искал эту ошибку на сайте, и все это я получаю сообщения об ошибках, относящиеся к STL и I не могу понять, являются ли те отчеты той же проблемой, что и у меня, и если да, то как обойти это. Я делаю что-то неправильно?

Я пытался (наверное глупо), чтобы типаж обижая линии, как

return (int) symbolTable[symbol]; 

Спасибо за любую помощь.

Мой заголовочный файл объявляет класс как:

class SymbolTable { 
public: 
    SymbolTable(); 
    void addEntry(string, int); 
    bool contains(string); 
    int getAddress(string); 
private: 
    map <string, string> symbolTable; 
    int address; 
}; 
+0

Пожалуйста, покажите свое тело класса (то есть 'class SymbolTable {...'). –

+0

@chris Нет, ты бы не юморил меня и не объяснил, что ты имеешь в виду? – jds

+0

@ Justin: Я полагаю, что Оли хочет определения класса, потому что вы, похоже, сделали (почти во всех своих функциях) локальные копии членов класса, которые не будут делать то, что вы хотите. Похоже, что определение класса имеет неправильное определение symbolTable. –

ответ

3

это:

SymbolTable::SymbolTable() { // Constructor 
    map <string, int> symbolTable; 
         ^
         ^

является функцией локальной переменной, а не переменной члена. Это не то же самое, что и symbolTable, к которому вы обращаетесь, например. getAddress, который предположительно является переменной-членом. Вы не показали тело класса, но я предполагаю, что он определен по-разному.

+0

Даже если я объявил это в файле .h? Извините, только что началось с C++ – jds

+0

Также 'int address = 0;' в конструкторе. 'address ++;' в функции 'add' также увеличивает неправильную переменную' address'. –

+0

@ Justin: Да. Локальные переменные скрывают переменные-члены. –

Смежные вопросы