当执行一个程序时,我在其中最小化一个确定性有限自动机(DFA,更多信息,https://es.wikipedia.org/wiki/Aut%C3%B3mata_deterministic_finite),我使用 set 和 map 容器来自 C++ 的 stl,但它给了我在该函数 (dfaminimo) 中我不理解的错误,错误如下:
我感谢您的帮助。
estadoDFA.cpp:34:12: error: binding ‘const std::map<char, int>’ to reference of type ‘std::map<char, int>&’ discards qualifiers
return trans_;
参考 EstadoDFA 文件的以下行:
map<char,int>& estado:: get_transiciones(void) const{
return trans_; //LINEA 34
}
在那个函数中,我做了无数的补丁,把它返回的东西总是const
,把它放在const
后面get_transiciones(void)
,但它给了我更多的错误。
第二个错误:
地图&状态:: get_transitions(void) const{ return trans_; }
PS:我已经查看了具有相同错误的类似问题,尝试了建议的解决方案,但它不适合我。
DFA.cpp:414:74:错误:'class std::map' 没有名为'second'的成员 if(oldpart[k].find((*it).get_transitions().second) == oldpart[k] 。结尾()){
我也不明白这个错误。
在这里,我留下错误的函数代码:
DFA.cpp 中的 dfaminimo 之一
void dfa::dfaminimo(){
//cjtos.push_back(cjto);
//un vector al que le inserto cosas parametro
map<char,int>::iterator it1;
//vector<set<int> > cjtos;
set<estado> particion1; //el estado de muerte
set<estado> particion2; //el resto de estados
vector<set<estado> > conjuntos;
//no hace falta llamar a la funcion operator <, lo llama insertar en su implementacion interna
//particion2=cjtos;
for(int i=0;i<estados_.size();i++){
if(estados_[i].get_aceptacion()!=true){
particion2.insert(estados_[i]);
}
else{
particion1.insert(estados_[i]);
}
}
conjuntos.push_back(particion1);
conjuntos.push_back(particion2);
vector<set<estado> > temporal;
do{
temporal = conjuntos;
conjuntos = crear_nueva_particion(temporal);
}while(conjuntos.size()!=temporal.size());
construir_dfa(conjuntos);
}
这里调用的函数:
vector<set<estado> > dfa::crear_nueva_particion(vector<set<estado> > temporal){
vector<set<estado> > conjunto;
for(int i=0; i<temporal.size();i++){
//conjunto = conjunto | descomp(temporal[i],temporal);
set<estado> newpart = descomp(temporal[i],temporal);
//set<estado>::iterator it1;
conjunto.push_back(newpart);
}
//unione.push_back(operando2);
return conjunto;
//return unione;
}
这里是分解功能,我将集合分开
set<estado> dfa::descomp(set<estado> conj, vector<set<estado> > partvieja){
set<estado> T = conj;
map<char, int>::iterator it1;
set<char> simbolos;//simbolos del alfabeto que el DFA reconoce
for(it1=estados_[0].get_transiciones().begin();it1!=estados_[0].get_transiciones().end();it1++){
simbolos.insert((*it1).first);
}
set<char>::iterator it2;
for(it2=simbolos.begin(); it2!=simbolos.end();it2++){
set<estado> P;
set<estado>::iterator iterador;
for(iterador= T.begin(); iterador!=T.end();iterador++){
set<estado> Tprima = part(conj,(*it2),partvieja);
//P = P | Tprima;
set<estado>::iterator it1;
for(it1= Tprima.begin(); it1!=Tprima.end();it1++){
P.insert((*it1));
}
}
T = P;
}
return T;
}
谢谢
错误很清楚的告诉你问题出在哪里,可能你看不懂,因为是英文的,我翻译一下:
它基本上告诉您常量类型的对象不能被非常量引用引用。在 C++ 中,对常量对象进行非常量引用是非法的。
trans_
您在函数中返回的对象get_transiciones
是常量,因为函数是常量:解决方案。
您可以通过两种方式解决此问题:通过返回常量或删除函数限定符:
或没有常数: