Ошибка передачи карты в шаблонную функцию в C ++ - PullRequest
0 голосов
/ 30 ноября 2011

Я немного ударился головой о кирпичную стену и решил отправить и просто опубликовать свою ошибку.

У меня есть шаблон (показанный ниже), который передает 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 ]

3 голосов
/ 30 ноября 2011

Согласно сообщению об ошибке, вы передали указатель на карту в качестве второго параметра, в то время как функция ожидает ссылку на карту.

Вы можете увидеть это из-за * в конце здесь:

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

После исправления возникнут дополнительные проблемы: поскольку x имеет тип ClassC*, вызов x.Index() выдаст ошибку. Возможно, первый параметр шаблона должен быть ClassC вместо ClassC*.

0 голосов
/ 30 ноября 2011

В вашем последнем редактировании вы говорите, что

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 есть, поэтому вам не нужно много работать с указателями, поэтому старайтесь избегать их как можно больше).

0 голосов
/ 30 ноября 2011

ваша подпись неверна

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 голосов
/ 30 ноября 2011

Ваше определение шаблона говорит:

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

И вы вызываете эту функцию с помощью:

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

... и вы говорите, что B равно:

std::map<int,ClassD*>

Итак, для вашего шаблона B - это int, а C - это ClassD * ... Вот почему нет совпадения.

Или, может быть, нет, я имею в виду имя, которое вы выбрали для значенийТо же самое относится и к классам в вашем шаблоне, что весьма запутанно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...