boost::spirit のドキュメントでは、文法は struct を使用して定義されています。例えば、
template <typename Iterator>
struct my_grammar
: qi::grammar<Iterator, qi::locals<std::string>, ascii::space_type >
{
my_grammar()
: my_grammar::base_type(start, "start")
{
// using this and that
// rules and action etc.
}
};
クラスを使用して記述できるかどうか疑問に思っています(そうでない場合は、なぜですか?)。私はこれをやっています。
ヘッダファイル内
template<typename Iterator>
class my_grammar
{
public:
my_grammar();
// rules declaration goes here.
};
そしてソースファイルで
template<typename Iterator>
my_grammar::my_grammar()
: qi::grammar::base_type(start, "start")
{
// write grammar and actions.
}
名前空間は、typedef を使用して短縮されています。上記の方法を使用して書いていますが、コンパイラーが理解するのが難しいエラーが多すぎます。それは基本的に大丈夫ですか、それとも私は何か奇妙なことをしていますか?
誰かが構造体の代わりにクラスを使って文法を書いているコードを教えてもらえますか?
アップデート :
現在リンクできません。undefined reference to
dimacs_grammar<__gnu_cxx::__normal_iterator, std::allocator > > >::my_grammar()`と書かれています。問題は、構造体を使用しているときに書いていたことです
my_grammar()
: my_grammar::base_type(start, "start")
これと同等のクラス宣言と定義を書く方法がわかりませんか?