2015-03-16 2 views
0

Я использую C# около года, я пытаюсь перейти на C++ в visual studio. Во всяком случае, я пытаюсь создать родовое двоичное дерево на C++ и столкнулся с несколькими ошибками компиляции, которые я не могу исправить.Шаблон Классы и методы в C++

Первоначальные исследования, казалось, указывали на то, что шаблон шаблона находится внутри файла заголовка, но это дало мне множество других ошибок.

Некоторые советы от кого-то, у кого больше опыта, будут очень оценены.

Thanks

Это код.

#include "stdafx.h" 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TreeNode<int> IntTree(1, TreeNode<int>(1), TreeNode<int>(2)); 
    cout << IntTree.toString() << endl; 
    return 0; 
} 


template<class TData> class TreeNode 
{ 

private: 
    TData Data; 
    TreeNode<TData>& Left; 
    TreeNode<TData>& Right; 

    void setData(TData data) 
    { 
     Data = data; 
    } 

public: 
    TreeNode<TData>(TData data) 
    { 
     setData(data); 
    } 

    TreeNode<TData>(TData data, TreeNode<TData> leftNode, TreeNode<TData> rightNode) 
    { 
     setData(data); 
     setLeft(leftNode); 
     setRight(rightNode); 
    } 

    void setLeft(TreeNode<TData>& leftNode) 
    { 
     Left = leftNode; 
    } 

    void setRight(TreeNode<TData>& rightNode) 
    { 
     Right = rightNode; 
    } 

    TreeNode<TData>& getLeft() 
    { 
     return Left; 
    } 

    TreeNode<TData>& getRight() 
    { 
     return Right; 
    } 

    TData& getData() 
    { 
     return &Data; 
    } 

    string toString() 
    { 
     return Left->toString() + Data + Right->toString(); 
    } 
}; 
error C2228: left of '.toString' must have class/struct/union. 
error C2065: 'TreeNode' : undeclared identifier. 
error C2065: 'IntTree' : undeclared identifier 
error C2062: type 'int' unexpected. 
+0

У C++ нет дженериков, у него есть шаблоны. – Mgetz

+0

Объявление декларации TreeNode должно появиться перед 'main()'. C++ использует компилятор с одним пропуском, поэтому, если нет какого-то слова, говорящего о том, что такое TreeNode, когда компилятор первым обнаруживает его, он выдает ошибку. – NathanOliver

+0

Благодарим за техническое объяснение, так как теперь я могу понять, в чем заключается цель декларации или даже лучше запомнить объявить все типы выше основного метода. –

ответ

2

В момент использования в вашем _tmain()TreeNode<> пока не объявлена.

Вы должны поместить полное объявление/определение класса шаблона до _tmain() или даже лучше поместить его в отдельный файл заголовка и включить его.

+1

Добавление форвардного объявления не работает. Перед '_tmain()' вам потребуется полное определение класса. –

+0

@RSahu Вы правы, форвардная декларация не помогает. Я исправил это. –

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