在C ++中将映射传递给模板函数时出错

时间:2011-11-30 14:22:59

标签: c++ templates

我一直撞到砖墙上,并决定提交并发布我的错误。

我有一个模板(如下所示)传递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*>*  

我做错了什么?

4 个答案:

答案 0 :(得分:3)

根据错误消息,您将指向地图的指针作为第二个参数传递,而该函数需要引用地图。

你可以看到这个,因为最后的*

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

解决此问题后会出现其他问题:由于x的类型为ClassC*,因此调用x.Index()会出错。也许第一个模板参数应该是ClassC而不是ClassC*

答案 1 :(得分: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 * ......这就是没有匹配的原因。

或者可能不是,我的意思是,您为模板中的类选择的名称与模板中的类相同,这非常令人困惑。

希望这有帮助。

答案 2 :(得分: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是ClassD *,而不是ClassC *对吧?

答案 3 :(得分: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*> &

第二个参数。所以指向地图与地图的引用。我想你应该传递*B,或者B不应该是指针(STL就在那里,所以你不需要使用指针,所以尽量避免使用它们。)