у меня есть
using namespace std;
typedef vector<Coil*> CoilVec;
CoilVec Coils;
с Coil
, являющимся базовым классом для CilCoil
и RectCoil
, цилиндрической катушкой и прямоугольной катушкой, соответственно. Теперь я хочу вызвать функцию-член calcField
для каждого Coil
, указанного в Coils
. Эта функция-член является чисто виртуальной в базовом классе, но была реализована в производных классах, и ее объявление выглядит следующим образом:
virtual TVector3 calcField(const TVector3&);
, где TVector3
- трехмерный векторный класс из библиотеки RooT. Идея теперь состоит в том, чтобы вычислить поле каждого Coil
в Coils
и сложить их вместе. Поскольку аргумент calcField
(а именно, вектор для позиции, в которой нужно вычислить поле) будет одинаковым для каждого вызова, я хотел бы использовать алгоритм STL из заголовка <algorithm>
или <numeric>
, чтобы сделать что-то как это (воображаемый):
using namespace std;
typedef vector<Coil*>::const_iterator CoilIt;
const TVector3& P(1.,1.,1.); // Let's say we want to know the total field in (1,1,1)
TVector3 B; // Default initialization: (0,0,0)
CoilIt begin = Coils.begin();
CoilIt end = Coils.end();
B = accumulate(begin, end, B, bind2nd(mem_fun(&Coil::calcField), P));
Очевидно, поскольку я здесь, чтобы задать вопрос, похоже, это не работает. Поэтому мой вопрос довольно прост: почему это не работает и / или как бы вы поступили правильно (в рамках STL)?
Я получаю следующие сообщения об ошибках, пытаясь скомпилировать вышесказанное (файл, в котором я работаю, называется Interface.cpp, это сторонний код):
In file included from /usr/include/c++/4.5/numeric:62:0,
from Interface.cpp:7: /usr/include/c++/4.5/bits/stl_numeric.h: In function ‘_Tp std::accumulate(_InputIterator, _InputIterator, _Tp, _BinaryOperation) [with _InputIterator = __gnu_cxx::__normal_iterator<Coil* const*, std::vector<Coil*> >, _Tp = TVector3, _BinaryOperation = std::binder2nd<std::mem_fun1_t<TVector3, Coil, const TVector3&> >]’:
Interface.cpp:289:72: instantiated from here
/usr/include/c++/4.5/bits/stl_numeric.h:150:2: error: no match for call to ‘(std::binder2nd<std::mem_fun1_t<TVector3, Coil, const TVector3&> >) (TVector3&, Coil* const&)’
/usr/include/c++/4.5/backward/binders.h:147:7: note: candidates are: typename _Operation::result_type std::binder2nd<_Operation>::operator()(const typename _Operation::first_argument_type&) const [with _Operation = std::mem_fun1_t<TVector3, Coil, const TVector3&>, typename _Operation::result_type = TVector3, typename _Operation::first_argument_type = Coil*]
/usr/include/c++/4.5/backward/binders.h:153:7: note: typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = std::mem_fun1_t<TVector3, Coil, const TVector3&>, typename _Operation::result_type = TVector3, typename _Operation::first_argument_type = Coil*]