2011-11-30 120 views
0

我一直在磚牆上碰撞一下頭,並決定提交併發佈我的錯誤。將映射傳遞給C++中的模板函數時出錯

我有一個模板(如下所示),它傳遞一個名稱空間內的std :: map。這編譯好。

嘗試調用函數模板時出現我的問題。我得到下面的錯誤:

error: no matching function for call to 
    'getValuePointer(Muon*&, std::map<int, MET*, std::less<int>, 
        std::allocator<std::pair<const int, MET*> > >*&)' 

我在做什麼錯?

這裏是模板代碼:

#ifndef OBJECTMAPMATCH_H 
#define OBJECTMAPMATCH_H 

#include <map> 
#include <utility> 
#include <typeinfo> 
#include <iostream> 
#include <stdlib.h> 

using namespace std; 

namespace ObjectMapMatch { 


    template< class A, class B, class C > 
    C getValuePointer(A &x , map< B,C> &y) 
    { 

    if(y.find(x.Index()) != y.end()){ 

     return y.find(x.Index()).second; 

    }else{ 
     cout << "ERROR:ObjectMapMatch::getValuePointer:Can not Find " 
      << typeid(y).name() << " FOR " << typeid(x).name() << endl; 
     exit(1); 
    } 

    } 

} 
#endif 

下面是一個例子調用模板函數

C = ObjectMapMatch::getValuePointer<ClassC*, int, ClassD*>(A, B); 

其中:

C is ClassC* 
A is ClassC* 
B is std::map<int,ClassD*>* 

我在做什麼錯?

+0

我構建了一個[類似的例子](http://ideone.com/Relqo),它運行良好。 –

+1

這不是一個解決方案,但只是一個有用的註釋 - 除非我錯了,在這種情況下可以使用所謂的「模板類型推斷」,並簡化對'C = ObjectMapMatch :: getValuePointer(A,B) 。類型''將被自動推斷 – Nate

+0

我將添加到Nate,您不僅可以,而且應該*應該使用模板類型推理(當然只適用於函數模板)。 –

回答

3

根據錯誤消息,您傳遞了一個指向地圖的指針作爲第二個參數,而函數期望對地圖的引用。

你可以看到這一點,因爲在*這裏結束:

no matching function for call to 
    'getValuePointer(Muon*&, std::map<...>*&)' 
             ^

將會有更多的問題,一旦你解決這個問題,但:由於xClassC*類型,調用x.Index()會給出一個錯誤。也許第一個模板參數應該是ClassC而不是ClassC*

+0

這種說法的更爲明確的方式是不應將「B」聲明爲指針。 – Nate

+0

@Nate:是的,但最初的問題是B不是一個指針(這顯然是錯誤的)。它已被編輯。 – interjay

+0

你先生是絕對正確的。不知道我是如何錯過的。 +1都一樣。 – Nate

0

你的模板定義說:

C getValuePointer(A &x , map< B,C> &y) 

你與調用這個函數:

ObjectMapMatch::getValuePointer<ClassC*, int, ClassD*>(A, B); 

...你說B是:

std::map<int,ClassD*> 

所以,對於你的模板B是一個int,而C是一個ClassD * ...這就是爲什麼沒有匹配。

或者可能不是,我的意思是,您爲模板中的類選擇的值的名稱是相同的,這是相當混亂的。

希望這會有所幫助。

0

你的簽名是錯誤的

template< class A, class B, class C > 
C* getValuePointer(A* x , map<B, C*> &y) 
{ 
    if(y.find(x->Index()) != y.end()){ 
     return y.find(x->Index()).second; 
    }else{ 
     cout << "ERROR:ObjectMapMatch::getValuePointer:Can not Find " 
      << typeid(y).name() << " FOR " << typeid(x).name() << endl; 
     exit(1); 
    } 
} 

和調用它

ObjectMapMatch::getValuePointer<ClassC, int, ClassD>(A, B); 

但C D類*,不ClassC *吧?

0

在上次編輯你說

B is std::map<int,ClassD*>* 

,但你的函數是

template< class A, class B, class C > 
C getValuePointer(A &x , map< B,C> &y) 

從而接受

std::map<int,ClassD*> & 

的第二個參數。所以指向地圖與參考地圖。我想你應該傳遞*BB不應該是指針(STL在那裏,所以你不需要使用指針,所以儘量避免使用它們)。