Проблемы с шаблоном - Проблемы с передачей функции в качестве аргументов (недопустимое использование нестатической функции-члена) - PullRequest
0 голосов
/ 06 ноября 2010

Вот шаблон, который я сделал.Я считаю, что это само собой разумеющееся

   template <class N, class I>
    std::list<N*> selectiveList(I element, std::list<N*> & container, I (N::*f)() const) {
 typename std::list<N*>::iterator it;

 std::list<N*> selectiveListing;

 for (it = container.begin(); it != container.end(); ++it)
  if ((*it)->*f == element)
   selectiveListing.push_back(*it);

 if (selectiveListing.size() == 0)
  throw NoItemsFound<I>(element);

 return selectiveListing;
}

Я вызываю это из этой функции:

void AirportManager::searchAirplanesTypes() {
 clrscr();
 std::stringstream prompt;
 prompt  <<  "Escolha atributo a pesquisar: \n" <<
    "1) Tipo\n" <<
    "2) Descricao\n" << "3) Categoria\n";

 int choice = getNumberInput(prompt.str(), 1, 3);

 switch (choice) {
 case 1: {
  std::string searchElement1 = getStringInput("Tipo: ");
  pageNav(selectiveList(searchElement1, airport.airplanesTypes,
    &AirplaneType::getType), "", true, true);
  break;
 }
 case 2: {
  std::string searchElement2 = getStringInput("Descricao: ");
  pageNav(selectiveList(searchElement2, airport.airplanesTypes,
    &AirplaneType::getDescription), "", true, true);
  break;
 }
 case 3: {
            //Category is an enumerated data type
  Category searchElement3 = getCategoryInput("Categoria: ");
  pageNav(selectiveList(searchElement3, airport.airplanesTypes,
    &AirplaneType::getCategory), "", true, true);
  break;

 }
 }
}

Я действительно не вижу ничего плохогоНо когда я его скомпилирую, вот что происходит:

In file included from ..\src\AirportManager.cpp:14:0:
..\src\/headers/Template.h: In function 'std::list<N*> selectiveList(I, std::list<N*>&, I (N::*)()const) [with N = AirplaneType, I = std::basic_string<char>]':
..\src\AirportManager.cpp:1259:34:   instantiated from here
..\src\/headers/Template.h:340:3: error: invalid use of non-static member function
..\src\/headers/Template.h: In function 'std::list<N*> selectiveList(I, std::list<N*>&, I (N::*)()const) [with N = AirplaneType, I = Category]':
..\src\AirportManager.cpp:1265:31:   instantiated from here
..\src\/headers/Template.h:340:3: error: invalid use of non-static member function

Это немного случайно.Я не могу видеть, как статика вступает в игру здесь.Все упомянутые методы получения являются простыми константными возвращениями.

Я был бы рад получить некоторую информацию.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010

if (((*it)->*f)() == element)

1 голос
/ 06 ноября 2010

Канонический способ копирования элементов - использовать отрицательный std::remove_copy_if() или написать copy_if() алгоритм.ИМХО copy_if() является более четкой альтернативой, и хотя она не является стандартной функцией, ее очень легко написать правильно:

template<class In, class Out, class Pred>
Out std::copy_if(In first, In last, Out res, Pred p)
{
    while( first != last ) {
        if( p(*first) ) *res++ = *first;
        ++first;
    }
    return res;
}

Затем вы можете использовать ее так:* Приятно то, что вы можете использовать copy_if() для множества других вещей.Он работает с любым контейнером, а не только с std::list<N*>, и с любым унарным предикатом, будь то примитивная функция или объект функции.

0 голосов
/ 06 ноября 2010

Прошло много времени, но вам не хватает нового?

throw new NoItemsFound<I>(element);
...