Я пытался использовать числовые рецепты версия 3 в моем проекте c ++ с использованием C ++ Builder из RAD XE 2.
Тем не менее, компилятор жалуется на все строки, как
typedef const NRvector<Int> VecInt_I;
typedef NRvector<Int> VecInt, VecInt_O, VecInt_IO;
… говоря «ungültige Argumentenliste» (извините за немецкий), что переводится как invalid list of arguments
,
Использование того же файла в простой пустой программе работает нормально, хотя …
Но если я напишу в начале моего проекта C ++
#include <vcl.h>
#pragma hdrstop
#include "nr3.h"
int main(){
return 0;
}
… это дает мне эту ошибку.
Есть ли опция компилятора, которая вызывает это? Может быть, какая-то настройка проекта C ++ Builder?
nr3.h
делает using namespace std;
и это также загрязняет глобальное пространство имен всеми его определениями типов. Проблема с линией:
typedef const NRvector<Int> VecInt_I;
и другие линии, включающие Int
это потому что Int
решено System::Int
(vcl.h
включает в себя определение этой функции, а также using namespace System;
)
Есть дальнейшие ошибки с
typedef const NRmatrix<Char> MatChar_I;
из-за неопределенности между System::Char
(тип) и Char
определяется nr3.h
,
Там нет простого решения. nr3.h
имеет множество серьезных проблем, а не только то, что он загрязняет глобальное пространство имен. В качестве лейкопластыря вы можете редактировать его так, чтобы он помещал все свои определения в пространство имен (скажем, NR3
) и вывезти using namespace std;
, Но даже если вы его компилируете, этот код настолько ужасен, что вы столкнетесь со многими другими проблемами позже. Мой совет — просто не использовать его, и либо написать собственный код, основанный на его алгоритмах, либо полностью искать какое-то другое решение.