我正在使用VS2013中的Boost库构建Quantlib。我在VS2013中使用NuGet包管理器构建了Boost。
我的构建中有50个模糊符号错误实例。所有错误都与同一个变量相关: 容差 。下面是一个示例cpp文件,其中声明了变量然后被访问。我在第51,77和98行中遇到错误,这是使用变量 容差 的三个实例。
命名空间的定义没有任何 namespace_name ,并且没有 使用命名空间namespace_name; 行。我不知道这是一个问题还是问题是否是其他问题。我是C ++的新手,所以我将不胜感激任何帮助来解决这个问题。
#include "tqreigendecomposition.hpp"
#include "utilities.hpp"
#include <ql/math/matrixutilities/tqreigendecomposition.hpp>
using namespace QuantLib;
using namespace boost::unit_test_framework;
namespace {
Real tolerance = 1.0e-10;
}
void TqrEigenDecompositionTest::testEigenValueDecomposition() {
BOOST_TEST_MESSAGE("Testing TQR eigenvalue decomposition...");
Array diag(5);
Array sub(4,1);
diag[0]=11; diag[1]=7; diag[2]=6; diag[3]=2; diag[4]=0;
Real ev[5] = {11.2467832217139119,
7.4854967362908535,
5.5251516080277518,
2.1811760273123308,
-0.4386075933448487};
TqrEigenDecomposition tqre(diag, sub,
TqrEigenDecomposition::WithoutEigenVector);
for (Size i=0; i < diag.size(); ++i) {
const Real expected(ev[i]);
const Real calculated(tqre.eigenvalues()[i]);
if (std::fabs(expected-calculated) > tolerance) {
BOOST_FAIL(std::string("wrong eigenvalue \n")
<< "calculated: "
<< calculated
<<" expected : "
<< expected);
}
}
}
void TqrEigenDecompositionTest::testZeroOffDiagEigenValues() {
BOOST_TEST_MESSAGE("Testing TQR zero-off-diagonal eigenvalues...");
Array diag(5);
Array sub(4,1);
sub[0] =sub[2]=0;
diag[0]=12; diag[1]=9; diag[2]=6; diag[3]=3; diag[4]=0;
TqrEigenDecomposition tqre1(diag, sub);
sub[0]=sub[2]=1e-14;
TqrEigenDecomposition tqre2(diag, sub);
for (Size i=0; i < diag.size(); ++i) {
const Real expected(tqre2.eigenvalues()[i]);
const Real calculated(tqre1.eigenvalues()[i]);
if (std::fabs(expected-calculated) > tolerance) {
BOOST_FAIL(std::string("wrong eigenvalue \n")
<< "calculated: "
<< calculated
<< " expected : "
<< expected);
}
}
}
void TqrEigenDecompositionTest::testEigenVectorDecomposition() {
BOOST_TEST_MESSAGE("Testing TQR eigenvector decomposition...");
Array diag(2,1);
Array sub(1,1);
TqrEigenDecomposition tqre(diag, sub);
if (std::fabs(0.25 + tqre.eigenvectors()[0][0]
* tqre.eigenvectors()[0][1]
* tqre.eigenvectors()[1][0]
* tqre.eigenvectors()[1][1]) > tolerance) {
BOOST_FAIL("wrong eigenvector");
}
}
test_suite* TqrEigenDecompositionTest::suite() {
test_suite* suite = BOOST_TEST_SUITE("TQR eigendecomposition tests");
suite->add(QUANTLIB_TEST_CASE(
&TqrEigenDecompositionTest::testEigenValueDecomposition));
suite->add(QUANTLIB_TEST_CASE(
&TqrEigenDecompositionTest::testZeroOffDiagEigenValues));
suite->add(QUANTLIB_TEST_CASE(
&TqrEigenDecompositionTest::testEigenVectorDecomposition));
return suite;
}
编辑1
完整错误文本(从VS2013中的错误列表窗口复制)我将查看是否存在包含更多详细信息的某个日志文件。
Error 2 error C2872: 'tolerance' : ambiguous symbol C:\Users\wb459349\QuantLib-1.6\test-suite\tqreigendecomposition.cpp 52 1 testsuite
tqreigendecomposition.cpp
1>tqreigendecomposition.cpp(52): error C2872: 'tolerance' : ambiguous symbol
1> could be 'tqreigendecomposition.cpp(30) : QuantLib::Real `anonymous-namespace'::tolerance'
1> or 'tolerance'
好的,'公差'定义了两次。一旦进入具有'anonymous-namespace'的代码并且不确定第二个'容忍'是什么,可能在两个命名空间之一中,当使用“使用命名空间...”时,任何构建此Quantlib文件的命名空间都被调用了。 p>
答案 0 :(得分:3)
as @ n.m。表示避免using namespace
你可能有本地/成员变量与其他库的变量冲突。
示例:
using namespace std
...
cout << "Foo" << endl;
比
更模棱两可...
std::cout << "Foo" << std::endl;
总之,您有两种选择。
using namespace
并更新所有引用以使用::
范围解析运算符。我认为通常不使用using
的建议是合理的。但是,在这个特殊情况下,我的回答可能不是最好的建议。正如其他人所提到的,这些错误源于第三方库,因此最好指出这种与该库作者的不兼容性。