Почему функция operator() не может быть перегружена?

#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). Вероятно, вам следует объявить новую именованную функцию, а не перегружать () оператора.