我在parser.y
中有这些规则:
ident : TIDENTIFIER { $$ = new NIdentifier(*$1); delete $1; }
;
numeric : TINTEGER { $$ = NInteger(atol($1->c_str())); delete $1; }
;
当我使用g++ -o parser parser.y tokens.flex main.cpp
编译时,我得到:
parser.y:82:63: error: cannot convert ‘NInteger’ to ‘NExpression*’ in assignment
TINTEGER { $$ = NInteger(atol($1->c_str())); delete $1; }
^
这些是类定义:
class Node {
public:
virtual ~Node() {}
};
class NExpression : public Node {
};
class NInteger : public NExpression {
public:
long long value;
NInteger(long long value) : value(value) { }
};
class NIdentifier : public NExpression {
public:
std::string name;
NIdentifier(const std::string& name) : name(name) { }
};
我不明白为什么一个类可以转换而另一个类不能转换,因为两个类都继承自同一个父级,并且两个构造函数具有相同的机制。
答案 0 :(得分:2)
您无法将类的实例转换为指向实例的指针。请注意错误消息中的*
。
在适用的规则中,您将$$
设置为new NIdentifier
,这是指向新实例的指针。
答案 1 :(得分:1)
ident : TIDENTIFIER { $$ = new NIdentifier(*$1); delete $1; }
;
numeric : TINTEGER { $$ = NInteger(atol($1->c_str())); delete $1; }
;
您忘记在第一行添加new NInteger
。
答案 2 :(得分:0)
正如@ md5i所述,我没有使用NInteger
创建new
实例,因此堆中没有对象可供引用。通过在new
前添加NInteger
运算符来解决此问题。