在 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.
}
namespace 已使用 typedef 缩短。我正在使用上述方法编写,编译器给了我太多难以理解的错误。基本上没问题还是我在做一些奇怪的事情?
你能给我指出一些代码,其中有人使用 class 而不是 struct 来编写语法吗?
更新:
我现在无法链接。它表示 undefined reference to
dimacs_grammar<__gnu_cxx::__normal_iterator, std::allocator >>>::my_grammar()` 。问题是在使用 struct 时,我在写
my_grammar()
: my_grammar::base_type(start, "start")
我不确定如何为此编写等效的类声明和定义?
最佳答案
类和结构是等价的,除了成员的默认可见性(结构公开,类私有(private))。
您似乎忘记制作 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.
};
(注意添加的公共(public)继承)。
编辑(回复:链接器错误):
对于模板,通常实现应该存在于头文件中而不是源文件 (.cpp) 中(尽管也有异常(exception))。在您的头文件中,构造函数定义语法应为:
template<typename Iterator>
my_grammar<Iterator>::my_grammar()
: qi::grammar::base_type(start, "start")
{
// write grammar and actions.
}
(区别在于下面 Ken Wayne VanderLinde 指出的 <Iterator>
位)。
关于c++ - boost::spirit 中的类与结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750292/