2017-05-29 114 views
-1

我得到了2个使用具有2个参数MinHeap和HeapNode的模板的类。我在主类中创建了一个MinHeap对象,在该类中创建了一个向量,之后我调用插入函数,在MinHeap向量中插入一个HeapNode。获取变量类型名称

问题出现时插入方法我不能创建一个HeapNode因为变量类型不是由编译器给我的错误捕获:

型/价值不匹配的参数1在模板参数列表“模板类HeapNode'Heap.push_back(HeapNode(key,value));

主代码:

MinHeap<int,string> vector(); 
vector.insert(2,"Hola"); 

插入功能的代码:

void MinHeap<T,V>::insert(T key, V value){ 
Heap.push_back(HeapNode<typeid(key).name(),typeid(value).name()>  
(key,value)); 
} 

HeapNode类代码:

#ifndef HEAPNODE_H 
#define HEAPNODE_H 
template <class T, class V> 
class HeapNode { 
public: 
HeapNode(T newKey, V newValue); 
HeapNode(const HeapNode& orig); 
virtual ~HeapNode(); 
T getKey(); 
void setKey(T newKey); 
V getValue(); 
void setValue(V newValue); 
private: 
T key; 
V value; 

}; 

template <class T, class V> 
HeapNode<T,V>::HeapNode(T newKey, V newValue){ 
this->key = newKey; 
this->value = newValue; 
} 

template <class T, class V> 
T HeapNode<T,V>::getKey(){ 
return key; 
} 

template <class T, class V> 
void HeapNode<T,V>::setKey(T newKey){ 
this->key = newKey; 
} 

template <class T, class V> 
V HeapNode<T,V>::getValue(){ 
return value; 

} 
template <class T, class V> 
void HeapNode<T,V>::setValue(V newValue){ 
this->value = newValue; 
} 
#endif /* HEAPNODE_H */ 

MinHeap类代码:

#ifndef MINHEAP_H 
#define MINHEAP_H 
#include "HeapNode.h" 
#include <vector> 
#include <iterator> 
#include <typeinfo> 
#include <iostream> 

using namespace std; 
template <class T, class V> 
class MinHeap { 
public: 
    MinHeap(); 
    MinHeap(const MinHeap& orig); 
    virtual ~MinHeap(); 
    T size(); 
    T empty(); 
    void insert(T key,V value); 
    T min(); 
    T minValues(); 
    void removeMin(); 
    void printHeap(); 
    void removeMinAux(T i); 

private: 
    std::vector<T,V> Heap; 
    void swap(HeapNode<T,V>* parent, HeapNode<T,V>* child); 

}; 

/* 
template <class T, class V> 
MinHeap<T,V>::~MinHeap(){ 
    delete Heap; 
}*/ 
template <class T, class V> 
void MinHeap<T,V>::insert(T key, V value){ 
    Heap.push_back(HeapNode<typeid(key).name(),typeid(value).name()>(key,value)); 
} 
template <class T, class V> 
T MinHeap<T,V>::empty(){ 
    return Heap.empty(); 
} 
template <class T, class V> 
T MinHeap<T,V>::size(){ 
    return Heap.size(); 
} 
template <class T, class V> 
T MinHeap<T,V>::min(){ 
    return Heap.front().getKey(); 
} 

template <class T, class V> 
T MinHeap<T,V>::minValues(){ 
    return Heap.front().getValue(); 
} 

template <class T, class V> 
void MinHeap<T,V>::removeMin(){ 
    Heap.front() = Heap.back(); 
    Heap.pop_back(); 
    removeMinAux(0); 
} 

template <class T, class V> 
void MinHeap<T,V>::removeMinAux(T i){ 
    if(Heap.at(i*2+1)== 0){ 
     cout<< "Heap has been reordenated"<<endl; 
    }else{ 
     if(Heap.at(i*2+1).getKey()<Heap.at(i*2+2).getKey()){ 
      swap(Heap.at(i*2+1),Heap.at(i)); 
      removeMinAux(i*2+1); 
     }else{ 
      swap(Heap.at(i*2+2),Heap.at(i)); 
      removeMinAux(i*2+2); 
     } 
    } 


} 
template <class T, class V> 
void MinHeap<T,V>::swap(HeapNode<T,V>* parent, HeapNode<T,V>* child){ 
    T tmp; 
    tmp = *child; 
    *child = *parent; 
    *parent = tmp; 
    delete tmp; 

} 





#endif /* MINHEAP_H */ 


                   ^
+3

代码和问题表示对[typeid运算符](http://en.cppreference.com/w/cpp/language/typeid)的根本性误解。 – IInspectable

+0

MinHeap vector();看起来不对,它不是矢量 - 没有括号? –

+0

如果您的问题得到了令人满意的回答,那么您最好将答案标记为“已接受”,如果您发现该答案特别有用,请点赞。谢谢! – Rook

回答

3

不幸的是,您的代码存在的问题有点深刻。

你的主要代码创建一个像这样的分堆实例:

MinHeap<int,string> vector(); 

这不会建立我; Visual Studio中的一个新的版本,旧版本的GCC的各种投诉(你知道most vexing parse的,因为如何这样的事情可你绊倒的例子吗?)我改成了

MinHeap<int, string> v; 
都拒绝了

这构建了一个MinHeap实例与私有成员Heap,有效地看起来像这样:

std::vector<int,string> Heap; 

现在,如果你看一下文档的std::vector你会看到你在这里所做的是创建一个向量的int分配器 of string。这不会奏效,而且你肯定无法将HeapNode实例推送到它上面!

什么,你应该做的是这样的:

std::vector<HeapNode<T, V>> Heap; 

现在,在插入功能,你这样做:

Heap.push_back(HeapNode<typeid(key).name(),typeid(value).name()> (key,value)); 

这是作为IInspectable上面说,如何从根本上误解typeid操作符工作,也是对模板类型如何工作的误解。 typeid(foo).name()的名称的一种类型,而不是实际的类型本身。这就是为什么你的错误消息说“类型/值不匹配”。

您已经知道key的类型和value的类型......它们就在函数原型中!分别为TV

如果你这样做:

Heap.push_back(HeapNode<T,V>(key,value)); 

问题就没有了。可能会有更多问题,但由于您没有在您提供的代码中定义HeapNodeMinHeap的所有功能,因此我无法对这些功能做任何处理。

+1

(但是,是的,即使在人们做可怕的事情之前,'使用命名空间std'也是不鼓励的] – Rook