学習課題としておもちゃの正規表現エンジンを C++ で書いていますが、コンパイラ エラーが発生しています。さまざまな式のサブタイプを実装するクラスの定義は次のとおりです。
// ***************************************************************
// ***************************************************************
class RegexExpression {
public:
virtual RegexResult match(std::string);
};
// ***************************************************************
class RegexTerm : public virtual RegexExpression {
public:
RegexTerm(char c) : _matchChar(c) {}
RegexResult match(std::string);
private:
char _matchChar;
};
// ***************************************************************
class RegexNil : public virtual RegexExpression {
public:
RegexResult match(std::string);
};
// ***************************************************************
// ***************************************************************
class RegexBinaryExpression : public virtual RegexExpression {
public:
RegexBinaryExpression
(RegexExpression &lhs, RegexExpression &rhs) :
_lhs(lhs), _rhs(rhs) {}
protected:
RegexExpression _lhs;
RegexExpression _rhs;
};
// ***************************************************************
class RegexOr : public RegexBinaryExpression {
public:
RegexResult match(std::string);
};
// ***************************************************************
class RegexAnd : public RegexBinaryExpression {
public:
RegexResult match(std::string);
};
ただし、たとえば、RegexOr をインスタンス化しようとすると:
RegexOr regex(RegexTerm('a'), RegexNil());
次に、RegexBinaryExpression の 2 引数コンストラクターが表示されないことを示すコンパイラ エラーが発生します。
たとえば、RegexOr でコンストラクターを明示的に定義すると、次のようになります。
RegexOr(RegexExpression &l, RegexExpression &r) : RegexBinaryExpression(l, r) {}
次に、RegexNil を RegexExpression に変換できないと言われました。
ここで何が間違っていますか?