Ошибка компилятора при передаче функциональных объектов - PullRequest
0 голосов
/ 19 октября 2011

Скажем, вы хотите итеративно модифицировать элементы объекта-контейнера и что-то делать с элементами на каждой итерации. Код, который я придумал, чтобы сделать что-то вроде этого:

#include <vector>
#include <iostream>

template <class InputIterator, class Operation, class Callback>
void transformAndTraverse(InputIterator begin, InputIterator end,  Operation op,  Callback cb) {
  InputIterator start = begin;
  while (begin != end) {
    op(begin);
    cb(start, end);
    ++begin;
  }
}

template <class InputIterator>
struct plotFnObject {
  void operator()(InputIterator begin, InputIterator end) {
    while (begin < end) {
      std::cout << *begin << " ";
      ++begin;
    }
    std::cout << std::endl;
  }
};

template <class InputIterator>
struct addTwoFnObject {
  void operator()(InputIterator idata) { *idata += 2; }
};

int main(int argc, char **argv) {
  typedef std::vector<int>::iterator vec_iter;
  std::vector<int> vec;
  vec.push_back(0);
  vec.push_back(0);
  vec.push_back(0);

#ifndef DEMO_COMPILE_ERROR
  // the below works
  transformAndTraverse(vec.begin(), vec.end(), addTwoFnObject<vec_iter>(), plotFnObject<vec_iter>());
#else
  // but this generates compilation errors
  addTwoFnObject<vec_iter> addtwo();
  plotFnObject<vec_iter> plot();
  transformAndTraverse(vec.begin(), vec.end(), addtwo, plot);
#endif
}

Проблема в том, что я получаю некоторые трудные для понимания ошибки компилятора со второй формой:

$ g++ testtemplate.cpp -DDEMO_COMPILE_ERROR
testtemplate.cpp: In function 'void transformAndTraverse(InputIterator, InputIterator, Operation, Callback) [with InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, Operation = addTwoFnObject<__gnu_cxx::__normal_iterator<int*, std::vector<int> > > (*)(), Callback = plotFnObject<__gnu_cxx::__normal_iterator<int*, std::vector<int> > > (*)()]':
testtemplate.cpp:44:60:   instantiated from here
testtemplate.cpp:8:5: error: too many arguments to function
testtemplate.cpp:9:5: error: too many arguments to function

$ g++ testtemplate.cpp
$

Почему компилятор в порядке с созданием объектов-функций внутри строки, а не с созданием их вне строки и передачей их?

$ g++ --version
g++ (GCC) 4.5.3
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

Это объявления функций:

addTwoFnObject<vec_iter> addtwo();
plotFnObject<vec_iter> plot();

Это экземпляры локальных переменных:

addTwoFnObject<vec_iter> addtwo;
plotFnObject<vec_iter> plot;

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

transformAndTraverse(vec.begin(), vec.end(), addtwo, plot);
2 голосов
/ 19 октября 2011
addTwoFnObject<vec_iter> addtwo();
plotFnObject<vec_iter> plot();

объявляет функции с именами addtwo и plot, возвращая addTwoFnObject<vec_iter> и plotFnObject<vec_iter> соответственно.Удалите ().

Google для «наиболее неприятного анализа» для получения дополнительной информации.

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