gpt4 book ai didi

C++ 模糊符号错误

转载 作者:行者123 更新时间:2023-11-30 02:36:29 25 4
gpt4 key购买 nike

我在 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;

总而言之,您有两个选择。

  1. 找出所有可能与那些冲突的本地/成员变量包含的库并更新它们。
  2. 或两个(首选方法)停止使用 使用命名空间 并更新所有引用以使用 :: 范围解析运算符。

编辑:

我认为通常不使用 using 的建议是合理的。但是,在这种特殊情况下,我的回答可能不是最好的建议。正如其他人所提到的,这些错误源于第三方库,因此最好向该库的作者指出这种不兼容性。

关于C++ 模糊符号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com