2015-07-12 146 views
1

我越來越難找出調用使用模板的類的構造函數的解決方案。調用模板類的構造函數

--header文件

template <class Item> 
class Binary_tree 
{ 
    string file_name; 
    list<Item> arr_data; 
public: 
    Binary_tree(string fname); 
    void printArr(); 
}; 

--cpp文件

template <typename Item> 
Binary_tree<Item>::Binary_tree(string fname) 
{ 
    File_Name = fname; 
    total = 0; 
    root = nullptr; 

    std::ifstream filestream(fname); 
    string line; 

    while (!filestream.eof()) 
    { 
     filestream >> line; 
     arr_data.push_back(line); 
    } 
} 

template <typename Item> 
void Binary_tree<Item>::printArr() 
{ 
    int size = arr_data.size(); 

    for (int i = 0; i < size; i++) 
    { 
     cout << "arr_data [" << i << "] is: " << arr_data[i] << endl; 
    } 
} 

--main.cpp

int main(int argc, char** argv) 
{ 
Binary_tree<string> test(file); 
test.printArr(); 

return 0; 
} 

現在我越來越LNK1120 LNK2019和錯誤。

+0

請提供[最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)。什麼是'文件'? –

+0

因爲'test'可能被作爲函數聲明而不是變量。 –

+0

file是文件名,構造函數將使用該文件讀取數據並將其添加到Binary_tree類中定義的列表中。 – Gaurav

回答

0

您已經遇到most vexing parse

Binary_tree<string> test(Binary_tree<string>(file)); 

這是一個函數聲明,就像

Binary_tree<string> test(Binary_tree<string> file); 

...這聲明瞭一個名爲test功能,它接受一個Binary_tree<string>,因爲它的參數,並返回一個Binary_tree<string>

+0

我想創建一個Binary_tree 對象,我稍後可以使用它來調用它的方法。現在我無法調用printArr函數。我不斷收到像這樣的錯誤:表達式必須具有類的類型。 – Gaurav

3

注意:這個答案回答original這個問題被一個完全不同的問題取代!

聲明爲如在the Most Vexing Parse描述的函數:

Binary_tree<string> test(Binary_tree<string>(file)); 

此聲明的函數名爲test()返回Binary_tree<string>和採取一個參數或鍵入Binary_tree<string>命名file。以下是修復問題的變體:

Binary_tree<string> test0(file); 
Binary_tree<string> test1 = Binary_tree<string>(file); 
Binary_tree<string> test2{Binary_tree<string>(file)}; 
+0

我嘗試了所有這些,並且不斷收到以下4條LNK錯誤。 LNK2019和LNK1120 – Gaurav

+0

@Gaurav:當然。你需要定義函數模板,我想你是在一個單獨的.cpp文件中做的(你不顯示代碼,我需要使用我的千里眼不完全可靠)。如果你把函數模板的定義放到一個.cpp文件中,你需要明確地實例化它們(關於這個主題有很多問題和答案),看看我的[blog](http://kuhllib.com/2012/01/22 /源組織的模板/)。最簡單的方法是將函數模板的定義放入頭中,讓編譯器隱式地實例化它們。 –

+0

我看了一下你的頁面,我知道這個概念,而且大多數情況下我正在執行它,就像你展示的一樣。如果你想看到我的代碼,那麼這裏是: '#include'BinaryTree。H」 模板<類型名稱項> Binary_tree :: Binary_tree(串FNAME) { \t FILE_NAME = FNAME; \t總= 0; \t根= nullptr; \t的std :: ifstream的FILESTREAM(FNAME) ; \t串線;(!filestream.eof()) \t而 \t { \t \t FILESTREAM >>線; \t \t arr_data.push_back(line); \t} } INT主() { \t字符串文件= 「HeapQuestions.txt」; \t Binary_tree test(file); // =(Binary_tree (file)); \t \t test.printArr(); \t return 0; }' – Gaurav

相關問題