使用已删除的函数CONSTRUCTOR,没有匹配的函数来调用

use of deleted function CONSTRUCTOR, no matching function for call to

本文关键字:函数 调用 CONSTRUCTOR 删除      更新时间:2023-10-16

这段代码在My_grammar g;行给出了以下错误:

no matching function for call to boost::spirit::qi::grammar<My_grammar>::grammar()’
use of deleted function ‘My_grammar::My_grammar()’

我不明白,是不是应该有一个默认的(未删除)构造函数?但问题可能在别处。

我实现了一个构造函数,但它带来了新的错误,和教程/例子从来没有使用相同的方法(有些有构造函数,有些没有),或使用类我,文档,编译器或谷歌都不知道(CParser ??)。我认为这可能是因为我(没有)包括头,因为有很多我可以选择从提升/精神。同样,在可能过时的教程中,人们似乎没有包括相同的,或者使用我昨天,apt-get - fetch,最有可能是最新版本的boost中不存在的教程。我用的是Eclipse,以防它改变什么。

#include <iostream>
#include <cstdlib>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_rule.hpp>
using namespace boost::spirit;

#define BOOST_SPIRIT_DEBUG
struct My_grammar :
    public boost::spirit::qi::grammar<My_grammar>
{
public:
    template <typename ScannerT>
    struct definition
    {
    public:
        definition(My_grammar const& self)
        {
            sentence
                = 'a';
        }
        boost::spirit::qi::rule<ScannerT> sentence;
        boost::spirit::qi::rule<ScannerT> const&    start() const { return sentence; }
    };
};

int main() {
    My_grammar g;
    return EXIT_SUCCESS;
}

我觉得接下来会有更多的问题(例如:我已经尝试过parse()函数并失败了),但我想一次解决一个。

看起来你被"经典"精神解析器骨架卡住了。

Spirit V2是相当不同的,并且看起来已经取代了V1:

  • 迁移文档:从Spirit 1.8.x移植

下面是在Spirit V2中编写语法定义的方法:

#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename It>
struct My_grammar : public qi::grammar<It> {
    My_grammar() : My_grammar::base_type(sentence) {
        sentence = 'a';
    }
    qi::rule<It> sentence;
};
int main() {
    My_grammar<std::string::const_iterator> g;
}