0

在 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 todimacs_grammar<__gnu_cxx::__normal_iterator, std::allocator >> >::my_grammar()` 。问题是在使用结构时,我在写

 my_grammar() 
  : my_grammar::base_type(start, "start")

我不确定如何为此编写等效的类声明和定义?

4

2 回答 2

4

除了成员的默认可见性(结构为公共,类为私有)之外,类和结构是等价的。

看起来您忘记让您的类从您用于结构my_grammar的基类派生。qi::grammar<>因此,类构造函数实现中的基类初始值设定项对编译器来说似乎是无稽之谈。

简而言之,将您的类定义更改为:

template<typename Iterator>
class my_grammar
  : public qi::grammar<Iterator, qi::locals<std::string>, ascii::space_type >
{
  public:
    my_grammar();
    // rules declaration goes here.
};

(注意添加的公共继承)。

编辑(回复:链接器错误):

对于模板,通常实现应该存在于头文件中,而不是源 (.cpp) 文件中(尽管有例外)。在您的头文件中,构造函数定义语法应该是:

template<typename Iterator>
my_grammar<Iterator>::my_grammar()
  : qi::grammar::base_type(start, "start")
{
    // write grammar and actions.
}

(区别在于<Iterator>下面的 Ken Wayne VanderLinde 指出的一点)。

于 2012-01-05T21:50:46.337 回答
0

我看到的唯一问题是

template my_grammar::my_grammar()
         : qi::grammar::base_type(start, "start")
{
      // write grammar and actions.
}

应该

template<typename Iterator>
my_grammer<Iterator>::my_grammer()
: my_grammar<Iterator>::base_type(start, "start")
{
}

如果您希望它与您的struct.

另外,您class可能应该像

template <typename Iterator>
class my_grammar
    : public qi::grammar<Iterator, qi::locals<std::string>, ascii::space_type >
于 2012-01-05T21:50:17.143 回答