C ++模糊符号错误

时间:2015-09-17 17:35:40

标签: c++ boost

我正在使用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>

1 个答案:

答案 0 :(得分:3)

as @ n.m。表示避免using namespace你可能有本地/成员变量与其他库的变量冲突。

示例:

using namespace std
...
cout << "Foo" << endl;

更模棱两可
...
std::cout << "Foo" << std::endl;

总之,您有两种选择。

  1. 查找可能与其中的那些可能发生冲突的所有本地/成员变量 包含的库并更新它们。
  2. 或两个(首选方法)停止使用     using namespace并更新所有引用以使用::范围解析运算符。
  3. 编辑:

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