У меня естьВызов функции-члена с одним параметром (связан) для каждого объекта в контейнере
using namespace std;
typedef vector<Coil*> CoilVec;
CoilVec Coils;
с Coil
быть базовым классом для CilCoil
и RectCoil
, A cilindrical катушки и прямоугольной катушки, соответственно. Теперь я хочу вызвать функцию-член calcField
на каждом Coil
, указанном в Coils
. Эта функция члена чисто виртуальная в базовом классе, но была реализована в производных классов, и его заявление выглядит следующим образом:
virtual TVector3 calcField(const TVector3&);
с TVector3
быть вектор класса 3D из библиотеки 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*]
Не собирайтесь давать это как ответ, поскольку вы просили что-то в STL, но считали ли вы библиотеки Boost (в частности boost :: bind)? У меня была такая же проблема, как и исправление. – chameco
Похоже, вы хотите 'for_each', а не' накапливать'. – interjay
'Катушки' - это тип, а не объект, поэтому' Coils.begin() 'не имеет смысла. – fredoverflow