Я использова MTL под Линуксом - все замечательно работало.
Буквально вчера попробовал еще раз использовать в среде VS2005. Версия библиотеки последняя доступная для win с сайта проекта:
Код:
/* Name of package */
#define PACKAGE "mtl"
/* Version number of package */
#define VERSION "2.1.2-21"
Привожу последовательность действий и рассуждений.
1. Пишем содержимое каталога mtl/* в доступное место, прописываем пути, переносим пример из examples/lu_solve.cc. Предпринимаем попытку компилировать.
2. Получаем ошибку (первую среди многих)
Код:
Error 1 error C2977: 'std::reverse_iterator' : too many template arguments d:\testzone\equationssolvers\libs\mtl-2.1.2-21\mtl\reverse_iter.h 44
3. Смотрим в этот файл:
Код:
#if STD_REVERSE_ITER
template <class Iter>
class reverse_iter : public std::reverse_iterator<Iter> {
typedef std::reverse_iterator<Iter> super;
#else
template <class Iter>
class reverse_iter : public std::reverse_iterator<Iter,typename Iter::value_type,
typename Iter::reference, typename Iter::pointer> {
typedef std::reverse_iterator<Iter, typename Iter::value_type,
typename Iter::reference, typename Iter::pointer> super;
#endif
Очевидно, что выбор происходит в зависимости от параметра STD_REVERSE_ITER.
4. Он определен в файле mtl_config.h. Смотрим туда.
Код:
#if defined(_MSC_VER) && !defined(__MWERKS__)
# if ( _MSC_VER < 1300 )
# define _MSVCPP_ _MSC_VER
# else
# define _MSVCPP7_ _MSC_VER
# endif
#endif
/* Assuming that configure is not run for Visual C++ and
Metrowerks Codewarrior, so the above macros are not
yet defined.
*/
#if !defined ( _MSVCPP_ )
#define STD_REVERSE_ITER 1
#else
#define STD_REVERSE_ITER 0
#endif
_MSC_VER в VS2005 равно 1400. Поэтому _MSVCPP_ не определено и вроде бы STD_REVERSE_ITER должно быть равно 1.
Однако все идет не так

Проверяем:
Код:
#include <iostream>
#include "mtl/mtl_config.h"
void main(void)
{
std::cout << "_MSC_VER=" << _MSC_VER << std::endl;
std::cout << "_MSVCPP_=" << _MSVCPP_ << std::endl;
std::cout << "_MSVCPP7_=" << _MSVCPP7_ << std::endl;
std::cout << "STD_REVERSE_ITER=" << STD_REVERSE_ITER << std::endl;
};
Имеем результат:
Код:
_MSC_VER=1400
_MSVCPP_=1
_MSVCPP7_=1400
STD_REVERSE_ITER=0
То есть _MSVCPP все равно где-то определено, STD_REVERSE_ITER принимает совсем не то значение, на которое рассчитывают разработчики. И начинаются пляски в п.3.
VS - это совсем не то же самое, что и
Цитата:
any target platform with an ANSI C++ compiler
ЗЫ: А не отписать ли мне bug report...