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

файл - это имя файла, конструктор будет использовать этот файл для чтения данных и добавления его в список, определенный в классе 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

Примечание: этот ответ отвечает на оригинальный вопрос, который был заменен на совершенно другой qestion!

декларация для функции, как описано в 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, вам нужно будет явно их создать (есть много вопросов и ответов на эту тему), см. Мой [блог] (http://kuhllib.com/2012/01/22/источник-организация-оф-шаблонов /). Самый простой подход состоит в том, чтобы поместить определение шаблонов функций в заголовок, чтобы компилятор имплицитно инстанцировал их. –

+0

Я посмотрел на вашу страницу, и я знаю концепцию, и в основном я ее реализую, как вы показали. Если вы хотите увидеть мой код, то вот он: '#include "BinaryTree.ч» шаблон <имяТипа Item> Binary_tree :: Binary_tree (строка имя_файла) { \t File_Name = имя_файла; \t всего = 0; \t корень = nullptr; \t станд :: ifstream FileStream (имя_файла) ; \t ломаная линия; (! filestream.eof()) \t в то время как \t { \t \t FileStream >> линия; \t \t arr_data.push_back (строка); \t}} INT Основной() { \t строка файла = "HeapQuestions.txt"; \t Binary_tree test (file); // = (Binary_tree (файл)); \t \t test.printArr(); \t возвращение 0; } ' – Gaurav

Смежные вопросы