2011-11-30 6 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*> > >*&)' 

내가 뭘 잘못하고 있니?

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

내가 무슨 일을하고있는 중이 야 :

여기
#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); 

에 예를 호출입니다 : 여기

템플릿 코드?

+0

[유사한 예제] (http://ideone.com/Relqo)가 만들어져 잘 동작합니다. –

+1

해결책은 아니지만 도움이되는 메모입니다. 제가 틀리지 않는 한이 경우 "템플릿 유형 유추"라고하는 것을 사용할 수 있으며'C = ObjectMapMatch :: getValuePointer (A, B); 함수 호출을 단순화 할 수 있습니다. . 'TypeC, int, ClassD *>'타입은 자동으로 유추 될 것입니다. – Nate

+0

Nate에 추가 할 수있을뿐만 아니라 템플릿 유형 유추를 사용해야합니다 (물론 함수 템플릿에만 적용됩니다). –

답변

3

오류 메시지에 따르면 함수가 맵에 대한 참조를 기대하는 동안 두 번째 매개 변수로 맵에 대한 포인터를 전달했습니다.

당신 때문에 여기 끝에 *이 볼 수 있습니다 : 당신이 생각을 수정하면

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

추가 문제가있을 것입니다 : x 오류를 줄 것이다 x.Index()를 호출 입력 ClassC*이기 때문에. 첫 번째 템플릿 매개 변수는 ClassC* 대신 ClassC이되어야합니다. 그래서

std::map<int,ClassD*> 

:

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

그리고 당신이이 함수를 호출 :

+0

이 점을 더 자세히 지적하면 'B'는 포인터로 선언해서는 안된다는 것입니다. – Nate

+0

@ 네이트 : 사실, 원래 질문은 B가 포인터가 아니라고 말했습니다. (분명히 거짓이었습니다). 그것은 지금 편집되었습니다. – interjay

+0

당신은 절대적으로 옳습니다. 내가 어떻게 그것을 놓쳤는지 모르겠다. +1 똑같이. – Nate

0

템플릿 정의는 말한다

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

... 당신은 B가 있다고 템플릿 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는 ClassD *, ClassC * 옳지 않아?마지막 편집에서

0

당신은

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

하지만 기능은 따라서 두 번째 인수에 대한

std::map<int,ClassD*> & 

을 받아들이

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

것을 말한다. 따라서지도에 대한 포인터 대지도에 대한 참조입니다. *B 또는 B을 포인터로해서는 안됩니다 (STL이 있으므로 포인터로 작업 할 필요가 없으므로 최대한 많이 피하십시오).

관련 문제