2012-01-05 97 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