我正在 VS2013 中使用 Boost 库构建 Quantlib。我在 VS2013 中使用 NuGet 包管理器构建了 Boost。
我在构建中收到 50 个不明确符号错误实例。所有错误都与同一个变量相关: tolerance 。下面是一个示例 cpp 文件,其中声明并访问了变量。我在第 51,77 行和第 98 行中收到错误,这是使用变量 tolerance 的三个实例。
命名空间的定义没有任何 namespace_name 并且没有 using namespace 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'
好的,所以“公差”被定义了两次。一旦进入带有“匿名命名空间”的代码,并且不确定第二个“容差”是什么,可能是在构建此 Quantlib 文件的人在执行“使用命名空间...”时调用的两个命名空间之一中
作为@n.m。说避免
using namespace
你可能有与其他库冲突的本地/成员变量。
示例:
using namespace std
...
cout << "Foo" << endl;
比
更含糊...
std::cout << "Foo" << std::endl;
总而言之,您有两种选择。
using namespace
并更新所有引用以使用 ::
范围解析运算符。我认为一般来说不使用
using
的建议是合理的。然而,在这种特殊情况下,我的答案可能不是最好的建议。正如其他人提到的,这些错误源自第三方库,因此最好向该库的作者指出这种不兼容性。
.vscode/settings.json