2012-01-05 96 views
0

在boost :: spirit文档中,语法是使用struct定义的。例如,boost :: spirit中的类v/s结构

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") 

我不知道如何写等价类的声明和定义呢?

回答

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. 
}; 

(注意添加公有继承)。

编辑(重:连接errror):

有了模板,一般实施应该住在头文件中,而不是源(的.cpp)文件(但也有例外)。在你的头文件,构造函数定义语法应为:

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

(区别是<Iterator>位由下面肯韦恩VanderLinde指出)。

+0

另请注意Ken Wayne VanderLinde的回答如下 - 我没有注意到构造函数定义中缺少的模板参数,但不想在这里踩到他的脚趾...... – 2012-01-05 21:52:19

+0

除了一些链接问题外,它几乎可以工作。谢谢!我会尽快接受它。 '公众'做了诡计。 – Dilawar 2012-01-05 22:00:30

+0

我已经添加了对我的问题的更新。请看看你能否帮忙! – Dilawar 2012-01-05 23:05:57

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 > 
+0

哎呀错字有问题。让我编辑。我错过了一个参数。谢谢。让我试试这个。 – Dilawar 2012-01-05 21:52:25

+0

我想你的答案和我的答案我们已经解决了这个问题...... – 2012-01-05 21:53:23

+0

注意 - 私有继承是默认的。 – 2012-01-05 21:59:02