-1

我尝试使用RAD XE 2 中的 c++ Builder 在我的 c++ 项目中使用数字配方版本 3。
但是,编译器抱怨所有行,例如

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 项目设置?

4

1 回答 1

2

nr3.h确实如此using namespace std;,并且它还使用其所有 typedef 污染了全局命名空间。线的问题:

typedef const NRvector<Int> VecInt_I;

其他涉及Intis because的行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;. 但即使你编译它,这段代码也太可怕了,你以后会遇到许多其他问题。我的建议是干脆不要使用它,要么根据它的算法编写自己的代码,要么完全寻找其他解决方案。

于 2014-08-24T02:45:54.620 回答