我一直撞到砖墙上,并决定提交并发布我的错误。
我有一个模板(如下所示)传递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 :(得分: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就在那里,所以你不需要使用指针,所以尽量避免使用它们。)