#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