簡體   English   中英

無法轉換某些類,但其他可以。 C ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM