在c++中将map传递给模板函数时出错

Error passing map to template function in C++

本文关键字:函数 出错 c++ 中将 map      更新时间:2023-10-16

我一直在碰壁,决定提交,只是发布我的错误。

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

我做错了什么?

根据错误消息,您传递了一个指向map的指针作为第二个形参,而函数期望的是对map的引用。

你可以看到这个,因为*在这里末尾:

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

一旦你修复了这个问题,将会有额外的问题:由于xClassC*类型,调用x.Index()会给出一个错误。也许第一个模板参数应该是ClassC而不是ClassC*

你的模板定义说:

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

你正在调用这个函数:

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

…B是:

std::map<int,ClassD*>

所以,对于你的模板B是int,而C是ClassD*…这就是为什么没有匹配。

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

你的签名错了

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 *,而不是类C*,对吗?

你在上次编辑中说

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*> &

表示第二个参数。指向map的指针和指向map的引用。我想你应该要么传递*B,要么B不应该是指针(STL在那里,所以你不需要使用指针,所以尽量避免它们)。