2013-12-02 5 views
0

Код:Не удается получить сеттер работать

ЗАГОЛОВКА

class Parser{ 

private: 
    unsigned int cant_documentos; 
    unsigned int cant_terminos; 
    std::map<std::string,short> dicc_stopwords; 
    std::map<std::string,unsigned int> hash_frecuencias_globales; 
    std::map<std::string,std::map<std::string,unsigned int> > hash_frecuencias_locales; 
    std::map<std::string,std::string> hash_apariciones_unicas; 
public: 
    Parser(); 
    ~Parser(); 


public: 
    void setFrecuenciasGlobales(std::map<std::string,std::map<std::string,unsigned int> > frecuencias); 
}; 

КОНЕЦ HEADER

.CPP

КОНЕЦ CPP

COMPILER ВЫХОД :

parser/parser.cpp:102:30: error: no match for ‘operator=’ in ‘((Parser*)this)->Parser::hash_frecuencias_globales = frecuencias’ 
parser/parser.cpp:102:30: note: candidate is: 
/usr/include/c++/4.6/bits/stl_map.h:253:7: note: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = unsigned int, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, unsigned int> >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, unsigned int>] 
/usr/include/c++/4.6/bits/stl_map.h:253:7: note: no known conversion for argument 1 from ‘std::map<std::basic_string<char>, std::map<std::basic_string<char>, unsigned int> >’ to ‘const std::map<std::basic_string<char>, unsigned int>&’ 

В чем проблема?

+2

Его не ваша ошибка, но НИКОГДА не передайте такую ​​карту: 'map > frecuencias,'. Это копирует всю карту, это ужасно неэффективно. – RichardPlunkett

+0

Я идиот !!! Я знаю проблему. Не волнуйтесь, – user3013172

+0

введите неправильную карту, да? используется тип frecuencias_locales, но нужен тип frecuencias_globales. Не изменяет факт, который вы должны передать как const &. – RichardPlunkett

ответ

6

hash_frecuencias_globales является std::map<std::string,unsigned int>, и вы пытаетесь присвоить std::map<std::string,std::map<std::string,unsigned int> > к нему:

void Parser::setFrecuenciasGlobales(map<string,map<string,unsigned int> > frecuencias){ 
    hash_frecuencias_globales = frecuencias; // oops! 

Что касается прохождения frequencias по значению, это будет иметь смысл только если вы должны были двигаться от него, или позвонить std::map::swap , Для простого назначения было бы лучше передать ссылку const и избежать ненужных копий.

+0

Я бы предположил, что он взял ошибку hash_frecuencias_locales по ошибке. Достаточно распространенная ошибка, исправленная, как вы описываете. (Но, пожалуйста, используйте const &, прохождение карты по значению является злым.) – RichardPlunkett

2

freceuncias является отображение string на карте от string к unsigned int:

std::map<std::string, std::map<std::string, unsigned int> > frecuencias 

Вы пытаетесь присвоить это в hash_frecuencias_globales, что карта от string до unsigned int:

std::map<std::string,unsigned int> hash_frecuencias_globales; 

Это невозможно, следовательно, ошибка. Возможно, вы только хотели присвоить только часть frequencias, соответствующую определенному ключу?


В качестве примечания (а также указали @RichardPlunkett), вы должны пройти большие объекты, такие как карты по константной-ссылке, а не по значению, если вы собираетесь только осмотреть их или копировать части из них - это сэкономит много ненужного копирования.

+0

Не совсем его ошибка, с точки зрения патча, вам нужно прочитать имя функции и знать, что на самом деле не так. – RichardPlunkett

+1

@ RichardPlunkett Er? Ошибка состоит в том, что присваивание из 'frequencyencias' в' hash_frequencias_globales' имеет несоответствие типа. – Angew

+0

Да, это ошибка в смысле компилятора, но в человеческом смысле ошибка заключалась в том, что он использовал тип из неправильной цели в списке аргументов. Фактический патч должен был исправить тип, чтобы он соответствовал тому, что он ему присваивал, а не «Возможно, вы только хотели назначить только часть частот, соответствующих определенному ключу»? Следовательно, мое предложение о том, что ваша идея патча не была идеальной. – RichardPlunkett

1

Обратите внимание на тип frecuencias, это не тот же тип карты, что и hash_frecuencias_globales.

std::map<std::string,unsigned int> hash_frecuencias_globales; 
map<string,map<string,unsigned int> > frecuencias 
Смежные вопросы