2017-05-29 83 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