#c
#c
Вопрос:
Мне нужно определить новую функцию, используя те же параметры, что и другая функция, которая уже определена. Возможно ли это вообще? Я пытался это сделать, но получаю сообщение об ошибке:
ошибка: не удается перегрузить
Вот код:
#ifndef CORRELATOR_MEAN_SQUARE_DISPLACEMENT_HPP #define CORRELATOR_MEAN_SQUARE_DISPLACEMENT_HPP #includelt;halmd/numeric/blas/fixed_vector.hppgt; #includelt;typeinfogt; #include lt;boost/multi_array.hppgt; #include lt;memorygt; namespace correlator { class mean_square_displacement { public: typedef std::shared_ptrlt;boost::multi_arraylt;float, 2gt;gt; sample_type; typedef double result_type; // fixed_vectorlt;double, 3gt; result_type operator() (sample_type constamp; first, sample_type constamp; second) const { double msd = 0; size_t N = first-gt;size(); for (unsigned int i = 0; i lt; N; i) { for (unsigned int j = 0; j lt; 3; j) { double dr = (*first)[i][j] - (*second)[i][j]; msd = dr * dr; if (msd gt; 0) std::cout lt;lt; "msd::" lt;lt; msd lt;lt; std::endl; } } return msd/N; } // msd operator ends here result_type operator() (sample_type constamp; first, sample_type constamp; second) const { return (std::cout lt;lt; (*first)[0][0]lt;lt; "The first element :." lt;lt; std::endl); } }; } // namespace correlator #endif /* ! CORRELATOR_MEAN_SQUARE_DISPLACEMENT_HPP */
То, что я пытаюсь сделать, это использовать параметры (первый и второй) из первой функции оператора и использовать их для различных вычислений во второй функции. Что я здесь делаю не так? Я намеренно не публикую все файлы. Если кто-то хочет, я могу поделиться ими.
Комментарии:
1. Что бы вы хотели
correlator::mean_square_displacement{}(first, second)
сделать?2. Как компилятор мог отличить одно от другого? Рассмотрите различные (описательные) имена для этих функций или также передайте аргумент тега.
3. Никакая функция не может быть «перегружена» таким образом.
4. если у меня есть две функции
f(int)
в одном классе, и я вызываюobj.f(3)
, как компилятор может знать, какую из них я имел в виду? Перегрузка означает использование одного и того же имени с разными сигнатурами, то есть с разными типами аргументов или количеством. Повторное использование идентичных функций означает, что вы переопределяете одну и ту же функцию. Почему вы должны вызывать свою «вспомогательную функцию»operator()
, а не вызывать ееoperator_helper
вместо этого или каким-либо другим именем?5. @Artyer первый и второй-это 2D-массивы. Я хочу, скажем так, вычесть их.
Ответ №1:
Невозможно перегрузить одно и то же имя функции одной и той же сигнатурой (параметры и const/non-const). Вероятно, вам следует объявить новую именованную функцию, а не перегружать ()
оператора.