C++ 歧义符号错误

问题描述 投票:0回答:2

我正在 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 文件的人在执行“使用命名空间...”时调用的两个命名空间之一中

c++ boost
2个回答
3
投票

作为@n.m。说避免

using namespace
你可能有与其他库冲突的本地/成员变量。

示例:

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

更含糊
...
std::cout << "Foo" << std::endl;

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

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

编辑:

我认为一般来说不使用

using
的建议是合理的。然而,在这种特殊情况下,我的答案可能不是最好的建议。正如其他人提到的,这些错误源自第三方库,因此最好向该库的作者指出这种不兼容性。


0
投票

.vscode/settings.json

  • 如果代码没有错误
    • 根据你的说法,它运行良好
  • 然后确保检查根目录中的此文件
  • 由于设置中的一些自动更改
    • 它在编辑器中向我显示错误
© www.soinside.com 2019 - 2024. All rights reserved.