_Dist_type не объявлен в этой области

#c #stl #scope #g

#c #stl #область #g

Вопрос:

Мне было поручено заставить работать какой-то старый код. Он датирован 2006 годом, и я полагаю, что он был написан в Visual Studio. Я получаю эту ошибку при компиляции с g 4.5.2 с использованием ming32 на компьютере с Windows, и я получаю ту же ошибку при компиляции с g 4.1.2 на компьютере с unix (не уверен, какой вкус)

«_Dist_type не был объявлен в этой области»

 #include <algorithm>
#include <vector>

template<class ReturnType, class RandomIterator, class _Ty> inline
ReturnType interpolate(RandomIterator _F, RandomIterator _L, const _Tyamp; _V, RandomIterator _F2)
{
  return _Dist_type(_F);
}

class Interpolator
{
public:
  double interp(const std::vector<double>amp; xValues, const std::vector<double>amp; yValues, 
    const double x0) const
  {
    //1-D interpolation
    return interpolate<double>(xValues.begin(), xValues.end(), x0, yValues.begin());
  }
};
  

Я пробовал искать _dist_Type в Google, но, похоже, там не так много информации. Я нашел один источник, но я не уверен, насколько это может помочь. http://en.allexperts.com/q/C-1040/STL-Iterator.htm

Насколько я понимаю, _Dist_type является частью очень старой версии библиотеки STL, которой нет ни на одной машине сборки. Как я мог это решить? Я даже не уверен, что делает функция.

Любая помощь приветствуется.

Комментарии:

1. Конечно, трудно представить, что он сделал что-то полезное, учитывая, что он отбрасывает 3 из 4 переданных аргументов…

2. Я сократил пример до минимума, необходимого для создания ошибки.

Ответ №1:

_Dist_type это внутренняя деталь реализации, используемая стандартной библиотекой Visual Studio. Имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы реализацией и никогда не должны вызываться непосредственно из пользовательского кода.

Вам нужно будет выяснить, что делает эта функция, и дублировать функциональность переносимым способом. Если вам повезет, вы можете обнаружить, что в стандартной библиотеке есть функция, которая уже реализует эту функциональность, и вы можете просто заменить вызов.

Редактировать:
Оба Visual Studio 2005 и 2010 _Dist_type определили как

 template<class _Iter> inline
typename iterator_traits<_Iter>::difference_type
*_Dist_type(_Iter)
{   // return distance type from arbitrary argument
  return (0);
}
  

Таким образом, он просто возвращает значение 0 типа std::iterator_traits<RandomIterator>::difference_type

Комментарии:

1. После устранения проблемы вам следует найти человека, который реализовал эту функцию, и надрать ему задницу; затем объясните ему важность использования определенных интерфейсов.

2. ха-ха, да .. хотел бы я. Спасибо, я думаю, это приведет меня к решению довольно быстро: D