2015-07-12 213 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

相关问题