boost :: spirit中的类v / s结构

时间:2012-01-05 21:45:48

标签: c++ boost-spirit-qi

在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缩短名称空间。我正在使用上面的方法编写,编译器给了我太多难以理解的错误。它从根本上说是好的还是我做了一些奇怪的事情?

你能指点一些有人使用类而不是struct来编写语法的代码吗?

更新:

我现在无法链接。它说undefined reference to dimacs_grammar&lt; __ gnu_cxx :: __ normal_iterator,std :: allocator&gt; &GT; &gt; :: my_grammar()`。问题是,在使用struct时,我正在编写

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

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

2 个答案:

答案 0 :(得分:4)

课程&amp;除了成员的默认可见性(结构的公共,类的私有)之外,结构是等效的。

看起来您忘了让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所述。

答案 1 :(得分: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 >