2013-05-01 39 views
2

我正在使用模板創建我自己的容器的任務。我需要使用的容器稱爲Smaph,它包含兩對數字並與它們一起執行各種功能。我只能爲這個任務創建一個頭文件。我創建了一個單鏈接的類slink,它需要一個模板參數。C++成員函數的使用無效,你忘記了()?

目前,我試圖獲得一個模板的感覺和學習如何使用它們,所以我有一個非常簡單的例子,我希望你能幫助我。我在我的單鏈表類中有一個push_back函數來添加到我的模板中。出於某種原因,我不能將事情添加到我的slink中,因爲我得到一個編譯時錯誤,說成員函數的無效使用(push_back),你忘記了()?有人可以向我解釋爲什麼我得到這個錯誤? 謝謝!

template <typename T> 
class slink { 
    private: 
    struct node { 
    T datum; 
    struct node *next; 
    }; 
    node *head, *tail; 
    public: 
    slink() : head(0), tail(0) { 
    } 

    ~slink() { 
    clear(); 
    } 
    void push_back(const T &datum) { 
    node *p = new node; 
    p->datum = datum; 
    p->next = 0; 
    if (!tail)  
     head = p; 
    else 
     tail->next = p; 
    tail = p; 
    } 

template <typename Tfirst, typename Tsecond> 
class Smaph { 

    public: 
     Smaph(); 
     ~Smaph(); 
     Smaph(const Tfirst a, const Tsecond b) { 
      std::pair<Tfirst, Tsecond> pair1(a, b); 
      s.push_back(pair1); 
     } 
    private: 

     slink<std::pair<Tfirst, Tsecond> > s(); 


}; 

最後,我的主要測試我的程序。我現在想要做的就是通過我的Smaph將這兩個數字添加到我單獨鏈接的列表中。

int main() { 
     Smaph<int, double> s(3, 6.3); 
} 
+0

這將有助於發佈完整的錯誤消息,有問題的行。 – zneak 2013-05-01 21:10:01

+0

[Vexing parse](http://stackoverflow.com/q/1424510/1084416)等等。 – 2013-05-01 21:21:56

回答

3
slink<std::pair<Tfirst, Tsecond> > s(); 

這是一個叫s功能,它沒有任何參數,並返回slink<std::pair<Tfirst, Tsecond> >的聲明。當編譯器看到你做了s.push_back(pair1);,它想知道你想要做的那個糟糕的功能。取下(),使之成爲數據成員:

slink<std::pair<Tfirst, Tsecond> > s; 
+0

然後你必須在函數調用之前在構造函數中初始化s嗎? – 2013-05-01 21:12:39

+0

@AshBurlaczenko不,'s'將在構造函數的開頭自動構造。 – 2013-05-01 21:15:28

+0

哦,好的,我認爲用花括號聲明它會調用Slink的構造函數。謝謝。 – user1299379 2013-05-01 21:55:41

1

在這行你做:

slink<std::pair<Tfirst, Tsecond> > s(); 

這是聲明名爲s函數返回slink<std::pair<Tfirst, Tsecond> >。但你做了你的成員函數這裏面一個:

s.push_back(pair1); 

這是不對的,這就是爲什麼你的編譯器提醒你無效使用該成員函數。

要修復,刪除參數:

slink<std::pair<Tfirst, Tsecond> > s; 
相關問題