2013-07-24 53 views
3

我正在試圖創建一個模板函數,該函數重載了指針和非指針。我這樣做,它的工作。爲容器內容納的指針和非指針類型數據創建模板函數重載

template<class D, class V> 
    bool Same(D d, V v){ return d == v; } 

    template<class D, class V> 
    bool Same(D* d, V v) { return *d==v;} 

現在我想擴展它使得模板容器是paramater並且必須有一個版本與指針和其他與非指針容器中的容器。我無法弄清楚。我試過這個,但它不起作用。

template< template<class> class Container, class Data, class Value> 
    bool func(Container<Data> &c, Value v) 
    { 
     return c[0] == v; 
    } 

    template< template<class> class Container, class Data, class Value> 
    bool func(Container<Data*> &c, Value v) 
    { 
      return *c[0] == v; 
    } 

錯誤c2040表示int *與int的間接級別不同,並指向第一個函數。

我怎樣才能使它工作?

導出代碼

template<class D> 
class Vec 
{ 
    std::vector<D> m_vec; 
public: 
    void push_back(D d) { m_vec.push_back(d); } 
     D operator[](int i) { return m_vec[i]; } 
}; 
void test_template() 
{ 
    Same<int, int>(2,3); 
    Info i = {4}; 
    Same<Info, int>(i, 2); 
    Info ii = {2 }; 
    Info *pi = &ii; 
    Same<Info, int>(pi, 2); 

    Vec<int> iv; 
    iv.push_back(3); 
    func<Vec, int, int>(iv, 3); 
    Vec<int*> pv; 
    pv.push_back(new int(3)); 
    func<Vec, int*, int>(pv, 3); 
} 

回答

3

對於第二個呼叫func的休息,第二個模板參數應該只是int,不int *。否則,第二個func declaratino將查找Vec<int **>作爲第一個模板參數(因爲它有自己的指針)。

func<Vec, int, int>(pv, 3); 

編輯:作爲DYP提到的,你也可以離開了模板參數完全,因爲編譯器應該能夠從實際函數參數推斷出它們。

+1

+1或者只是省略顯式模板參數。 – dyp

+0

糟糕。大!謝謝。 – Dirt