2017-03-02 31 views
2

我有兩個模板類:問題與模板方法定義 - 錯誤C2244:無法函數定義匹配現有的聲明

template<typename D, typename V, typename Comp> 
class pQueueNodeComp; 

和:

template <typename D, typename V, typename Comp> 
class pQueueComp; 

裏面pQueueComp我有一個方法聲明因此:

​​

這裏的定義:

template <typename D, typename V, typename Comp> 
pQueueNodeComp<D, V, Comp>* pQueueComp<D, V, Comp>::lowest() { 
    return binaryHeap[0]; //binaryHeap is a vector<pQueueNodeComp<D, V, Comp>*> 
} 

我越來越對的Visual Studio 2015年以下錯誤:

1>d:\github\pqueue\pqueue\pqueuecomp.h(163): error C2244: 'pQueueComp<D,V,Comp>::lowest': unable to match function definition to an existing declaration 
1> d:\github\pqueue\pqueue\pqueuecomp.h(161): note: see declaration of 'pQueueComp<D,V,Comp>::lowest' 
1> d:\github\pqueue\pqueue\pqueuecomp.h(163): note: definition 
1> d:\github\pqueue\pqueue\pqueuecomp.h(163): note: 'pQueueNodeComp<D,V,Comp> *pQueueComp<D,V,Comp>::lowest(void)' 
1> d:\github\pqueue\pqueue\pqueuecomp.h(163): note: existing declarations 
1> d:\github\pqueue\pqueue\pqueuecomp.h(163): note: 'pQueueNodeComp<D,V,Comp> *pQueueComp<D,V,Comp>::lowest(void)' 

在我看來像聲明的定義相匹配。我瘋了嗎?

編輯:類和方法的定義在同一個文件中。

EDIT2:這裏是pQueueComp完整定義:

template <typename V, typename D, typename Comp> 
class pQueueComp { 
public: 
    pQueueComp(Comp _cmp) : 
     cmp(_cmp) 
    {}; 
    pQueueNodeComp<D, V,Comp>* add(const D& data, V value); 
    pQueueNodeComp<D, V,Comp>* lowest(); 


    void removeLowest(); 
    int size() { return binaryHeap.size(); }; 
    ~pQueueComp(); 
    pQueueComp() {}; 
    pQueueComp(const pQueueComp&) = delete; /*out of the scope of this project*/ 
    pQueueComp& operator=(const pQueueComp&) = delete; 
    void print(); 
private: 
    Comp cmp; 

    std::vector<pQueueNodeComp<D, V, Comp>*> binaryHeap; 

    void changeValue(int rank, V newValue); 


    void goDown(int rank); 
    void goUp(int rank); 
    void swap(int rank1, int rank2); 

    int parent(int i) { return (i + 1)/2 - 1; }; 
    int child1(int i) { return 2 * (i + 1) - 1; } 
    int child2(int i) { return 2 * (i + 1); } 

    friend class pQueueNodeComp<D, V, Comp>; 

}; 
我在與 lowestadd問題

+1

您的decleration的模板化類型屬於對其進行實例化的類,但定義是使用新的類型 – ZivS

+0

@ Rakete1111,可能不是重複的。他提到類和方法的定義在同一個文件中。 –

+0

你的班級裏有一些'使用'/'typedef'嗎? – Jarod42

回答

1

下面的編譯和運行與VS15: Header.h:

template <typename D, typename V, typename Comp> 
class pQueueNodeComp 
{ 
    D d; 
    V v; 
    Comp c; 
}; 


template <typename D, typename V, typename Comp> 
class pQueueComp 
{ 
public: 

    pQueueNodeComp<D, V, Comp>* lowest(); 
}; 

template<typename D, typename V, typename Comp> 
pQueueNodeComp<D, V, Comp>* pQueueComp<D, V, Comp>::lowest() 
{ 
    return nullptr; 
} 

main.cpp中:

#include "Header.h" 
int main() 
{ 
    pQueueComp<int, int, int> x; 
    auto y = x.lowest(); 

    return 0; 
} 

編輯:我看到你的EDIT2之前公佈。請注意,在您的第一個示例中,模板類型是一個順序,並且在pQueueComp的實際代碼中,VD模板參數是相反的

+0

反轉模板參數的竅門。非常感謝你! – Rch

+0

NP。作爲一個不相關的技巧 - 不要僅僅因爲將它用作指針而用「p」前綴命名類。以這種方式命名一個指向你類的指針的實例 – ZivS

+1

在這種情況下,'pQueue'是優先級隊列的簡寫(它與'std :: priority_queue相比有一些額外的功能),但我想它可以是混亂。那麼我會把它命名得更加明確些。再次感謝。 – Rch

相關問題