2014-02-05 120 views
-9

我使用Visual Studio 2012,我也得到了很多xmemory0错误。 这是一个通用的树实现。为什么这个C++代码不能编译?

#include <iostream> 
#include <list> 

template<class T> class Tree { 
public: 
    Tree(); 
    Tree(const T& pNode); 
    virtual ~Tree(); 

    const T& getNode(); 
    void setNode(const T& pNode); 

    void addChild(const Tree<T>& pChild); 
    const Tree<T>& getChild(int pIndex); 

    const std::list<Tree<T>>* getChildren(); 
    void printTree(const Tree<T>& pTree, int pLevel=0); 
private: 
    T node; 
    std::list<Tree<T>&>* children; 
}; 

template<class T> Tree<T>::Tree(const T& pNode) : node(pNode), children(nullptr) { 
} 

template<class T> Tree<T>::Tree() : node(T()), children(nullptr) { 
} 

template<class T> Tree<T>::~Tree() { 
    delete children; 
} 

template<class T> const T& Tree<T>::getNode() { 
    return this->node; 
} 

template<class T> void Tree<T>::setNode(const T& pNode) { 
    this->node=pNode; 
} 

template<class T> void Tree<T>::addChild(const Tree<T>& pChild) { 
    if(this->children==nullptr) { 
     this->children=new std::list<Tree<T>&>(); 
    } 

    this->children->push_back(pChild); 
} 

template<class T> const Tree<T>& Tree<T>::getChild(int pIndex) { 
    if(true) { 
    } 

    return this->children[pIndex]; 
} 

template<class T> void Tree<T>::printTree(const Tree<T>& pTree, int pLevel=0) { 
    for(int i=0; i<pLevel; i++) { 
     std::cout << " "; // Print 2 spaces for each level 
    } 

    std::cout << pTree.node << std::endl; 

    if(pTree.children!=nullptr) { 
     for(std::list<Tree<T>>::iterator i=pTree.children->begin(); i!=pTree.children->end(); i++) { 
      printTree(*i, pLevel+1); 
     } 
    } 
} 

template<class T> const std::list<Tree<T>>* Tree<T>::getChildren() { 
    return this->children; 
} 

int main(int argc, char **argv) { 
    Tree<int> a, b,c; 

    a.setNode(1); 
    b.setNode(2); 
    c.setNode(3); 

    b.addChild(c); 
    a.addChild(b); 


    a.printTree(a); 
} 

这是我得到的错误(我很抱歉,他们在意大利语言):

Errore 1 error C2528: 'pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 527 1 Translator 

Errore 2 error C2528: 'const_pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 528 1 Translator 

Errore 3 error C2535: 'Tree<T> &(*std::allocator<_Ty>::address(Tree<T> &) throw() const)': funzione membro già definita o dichiarata c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 561 1 Translator 

Errore 4 error C2528: '_Ptr': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 599 1 Translator 

Errore 5 error C2528: '_Ptr': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 604 1 Translator 

Errore 6 error C2528: 'pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 700 1 Translator 

Errore 7 error C2528: 'const_pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 701 1 Translator 

Errore 8 error C2535: 'Tree<T> &(*std::_Wrap_alloc<_Alloc>::address(Tree<T> &) const)': funzione membro già definita o dichiarata c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0 824 1 Translator 

Errore 9 error C2528: '_Ptr': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 890 1 Translator 

Errore 10 error C2528: 'abstract declarator': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 105 1 Translator 

Errore 11 error C2528: 'abstract declarator': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 107 1 Translator 

Errore 12 error C2528: 'pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 122 1 Translator 

Errore 13 error C2528: 'const_pointer': puntatore a riferimento non valido c:\program files (x86)\microsoft visual studio 
11.0\vc\include\xmemory0 123 1 Translator 

Errore 14 error C2535: 'void std::list<_Ty>::push_front(_Ty)': funzione membro già definita o dichiarata c:\program files (x86)\microsoft visual studio 11.0\vc\include\list 1276 1 Translator 

Errore 15 error C2535: 'void std::list<_Ty>::push_back(_Ty)': funzione membro già definita o dichiarata c:\program files (x86)\microsoft visual studio 11.0\vc\include\list 1286 1 Translator 

Errore 16 error C2535: 'std::_List_iterator<_Mylist> std::list<_Ty>::insert(std::_List_const_iterator<_Mylist>,_Ty)': funzione membro già definita o dichiarata c:\program files (x86)\microsoft visual studio 11.0\vc\include\list 1319 1 Translator 

Errore 17 error C2664: 'std::list<_Ty>::push_back': impossibile convertire il parametro 1 da 'const Tree<T>' a 'Tree<T> ' c:\users\me\documents\visual studio 2012\projects\translator\translator\main.cpp 46 1 Translator 

Errore 18 error C2440: 'inizializzazione': impossibile convertire da 'std::_List_iterator<_Mylist>' a 'std::_List_iterator<_Mylist>' c:\users\me\documents\visual studio 2012\projects\translator\translator\main.cpp 64 1 Translator 

Errore 19 error C2678: '!=' binario: non è stato trovato alcun operatore che accetti un operando sinistro di tipo 'std::_List_iterator<_Mylist>'. È anche possibile che non vi siano conversioni accettabili. c:\users\me\documents\visual studio 2012\projects\translator\translator\main.cpp 64 1 Translator 

据迈克·西摩的回答我改变了我的代码如下:

#include <iostream> 
#include <list> 

template<class T> class Tree { 
public: 
    Tree(); 
    Tree(const T& pNode); 
    virtual ~Tree(); 

    const T& getNode(); 
    void setNode(const T& pNode); 

    void addChild(const Tree<T>* pChild); 
    const Tree<T>* getChild(int pIndex); 

    const std::list<Tree<T>*>* getChildren(); 
    void printTree(const Tree<T>* pTree, int pLevel=0); 
private: 
    T node; 
    std::list<Tree<T>*>* children; 
}; 

template<class T> Tree<T>::Tree(const T& pNode) : node(pNode), children(nullptr) { 
} 

template<class T> Tree<T>::Tree() : node(T()), children(nullptr) { 
} 

template<class T> Tree<T>::~Tree() { 
    delete children; 
} 

template<class T> const T& Tree<T>::getNode() { 
    return this->node; 
} 

template<class T> void Tree<T>::setNode(const T& pNode) { 
    this->node=pNode; 
} 

template<class T> void Tree<T>::addChild(const Tree<T>* pChild) { 
    if(this->children==nullptr) { 
     this->children=new std::list<Tree<T>*>(); 
    } 

    this->children->push_back(*pChild); 
} 

template<class T> const Tree<T>* Tree<T>::getChild(int pIndex) { 
    if(true) { 
    } 

    return this->children[pIndex]; 
} 

template<class T> void Tree<T>::printTree(const Tree<T>* pTree, int pLevel=0) { 
    for(int i=0; i<pLevel; i++) { 
     std::cout << " "; // Print 2 spaces for each level 
    } 

    std::cout << pTree->node << std::endl; 

    if(pTree->children!=nullptr) { 
     for(std::list<Tree<T>*>::iterator i=pTree->children->begin(); i!=pTree->children->end(); i++) { 
      printTree(*i, pLevel+1); 
     } 
    } 
} 

template<class T> const std::list<Tree<T>*>* Tree<T>::getChildren() { 
    return this->children; 
} 

int main(int argc, char **argv) { 
    Tree<int> a, b,c; 

    a.setNode(1); 
    b.setNode(2); 
    c.setNode(3); 

    a.addChild(&b); 
    b.addChild(&c); 

    a.printTree(&a); 
} 

但我得到这个错误:

错误1错误C2664:'void std :: list < _Ty> :: push_b ACK(_Ty & &) ':不能从常量树转换参数1' 到 '树& &' 上线46

+0

你为什么不张贴在这里的代码? – Spook

+0

请发布您的代码。另请考虑发布在CodeReview – gartenriese

+2

如果您需要帮助,您需要向我们提供您遇到的错误。 – Simple

回答

-1
std::list<Tree<T>&>* children; 

标准集装箱不能存储引用类型。从代码的其余部分看来,它应该存储Tree<T>对象。 (如果你想引用其他地方存在的对象,你必须存储指针而不是引用;但这似乎并不是这种情况)。

还对申报都和printTree定义,缺少typename,你在printTree声明std::list<Tree<T>>::iterator i重复的默认参数;尽管你的编译器可能会接受这些错误。

+0

我加入了参考,因此如果我叫a.addChild后b.addChild(C)(B)我可以用一个孩子得到一个根目录(一)(二),其中有一个孩子(C) – WileTheCoyot

+0

看一看HTTPS: //ideone.com/r21oQi来完成你的回答 –

+0

@DieterLücking:我不太清楚你的意思。所有这些错误都是由我描述的三个问题引起的。代码编译,如果我解决这些问题:https://ideone.com/lwRWn9 –