Оператор ++ из базы CRTP не виден для компилятора

Вот функция, которую я часто использую. Это легко модифицировать для выполнения многих рекурсивных задач. Например, если вы добавляете флаг залога, вы можете быстро получить стек или добавить функцию обратного вызова, что делает ее еще более общей. Во всяком случае, это мои 2 цента

var recursiveObjMap = (function(){
  var stack = [];
  var result = [];
  // var bail = false;
  return function map(data, key){
    if (!$.isArray(data) && !$.isPlainObject(data) ) { 
      result.push(data);
      return false 
    }

    $.each(data, function(i, v){
      if (key) stack.push(key);
      map(v, i);
      stack.pop();
    });
    return result;
  };
})();

recursiveObjMap({a:'b',c:{d:{e:"f"}}}) // ['b', 'f']
1
задан bartop 17 March 2019 в 21:42
поделиться

2 ответа

Ваши две функции имеют одинаковое название, operator++. Это просто пишется иначе, чем функция с именем с идентификатором. Правило поиска членов класса заключается в том, что по умолчанию, если член с именем обнаружен в производном классе, базовый класс не проверяется. Производный элемент «скрывает» базовый элемент.

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

struct der : public base<der> {
    der &operator++(){
        return *this;
    }
    using base<der>::operator++;
};
0
ответ дан aschepler 17 March 2019 в 21:42
поделиться

Замените имя operator++ на имя f (то есть попробуйте то же самое с обычной функцией-членом). У вас будет такая же проблема. Компилятор находит названную функцию в der, поэтому она не выглядит в base<dir>. Перегрузка происходит только среди функций, определенных в той же области.

0
ответ дан Pete Becker 17 March 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: