C++ 尝试引用已删除的函数或已显式删除函数
在写编译原理的时候,在词法分析器类里放了一个ifstream
类型的成员变量,然后给语法分析器写一个构造函数,把生成的词法分析器作为参数传入。
声明代码大致如下:
class SimpleLexiconAnalyzer
{
public:
SimpleLexiconAnalyzer(string filename);
Word scan();
private:
ifstream stream;
char nextChar();
static ifstream openFile(string filename);
};
class GrammarAnalyzer
{
public:
GrammarAnalyzer(SimpleLexiconAnalyzer tokenSrc);
void parseRules(vector<Word> tokens);
static bool equals(vector<Word> a, vector<Word> b);
private:
SimpleLexiconAnalyzer &tokenSrc;
map<Word, vector<WordSeq>> rules;
};
然后就碰到了标题所述的问题。发现问题出在
GrammarAnalyzer(SimpleLexiconAnalyzer tokenSrc);
这一行。经过资料查阅后,发现在C++中stream类型的对象是不允许被复制的(在类的定义时,删除了operator=
操作),决定换用引用。查了老半天,卡在了引用的初始化上(根据C++语法,引用变量是不允许重新赋值的),然后在stackoverflow上受到了一点启发,写出了如下代码:
GrammarAnalyzer::GrammarAnalyzer(SimpleLexiconAnalyzer &tokenSrc): tokenSrc(tokenSrc) {}
然后错误消失,编译顺利通过。
顺带一提,启发来自一年前写的数据结构代码。鬼知道为什么当时我能查到可以这么写,结果一年后不但全忘了,连查都快查不到了。。。