2011-11-30 116 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在那里,所以你不需要使用指针,所以尽量避免使用它们)。