[英]Cannot convert some classes but others can. C++
我在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) { }
};
我不明白為什么一個類可以轉換而另一個類不能轉換,因為它們都繼承自同一個父類,並且兩個構造函數都具有相同的機制。
您不能將類的實例轉換為指向實例的指針。 注意錯誤消息中的*
。
在有效的規則中,將$$
設置為new NIdentifier
,它是指向新實例的指針。
ident : TIDENTIFIER { $$ = new NIdentifier(*$1); delete $1; }
;
numeric : TINTEGER { $$ = NInteger(atol($1->c_str())); delete $1; }
;
您忘記將new NInteger
放在第一行。
如@ md5i所述,我沒有使用new
創建NInteger
實例,因此堆中沒有要引用的對象。 通過在NInteger
前面添加new
運算符可以解決此NInteger
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.