【问题标题】:Outer namespace dragging in std namespace during lookup查找期间将外部命名空间拖入 std 命名空间
【发布时间】:2015-10-18 04:56:54
【问题描述】:

我目前正在重构一些旧代码以满足 C++14 的正确性标准,但发生了一些奇怪的事情。

到目前为止,此错误是唯一的,不会出现在其余代码中。我混淆了实际类型,因为它们并不重要。

在重构之前,以下代码运行良好:

namespace N {
    class A {
    public:
        A(B* blah) : _blah(blah); //class A owns the instance of class B.
        ~A() { delete m_blah; m_blah = nullptr; }
        //...Lots more code.
    private:
        B* m_blah;
    };
}

我将所有必要的基于所有权的指针更改为各自的智能指针:

#include <memory>

namespace N {
    class A {
    public:
        A(std::unique_ptr<B> blah);
        ~A() { /* DO NOTHING */ }
    private:
        std::unique_ptr<B> m_blah;
    };
}

这不再有效。 Intellisense 报错:

"Error: namespace "N::std" has no member unique_ptr"

在构造函数声明中。 (但不是m_blah的声明)

....什么?为什么标准库命名空间会被拉入 N?!

版本信息:

  • VS2015 社区版 (RTM) 版本 14.0.23107.0 D14REL
  • 开发人员命令提示符报告 cl 版本:编译器版本 19.00.23026

【问题讨论】:

  • #include &lt;memory&gt;了吗?
  • 您显示的代码 compiles by itself(也可以在 webcompiler.cloudapp.net 使用 VS2015 编译,但无法在那里获得永久链接)。问题一定出在你没有显示的代码上。
  • 您是否在namespace N 块中包含了标题?
  • @T.C.不,我没有。

标签: c++ c++11 namespaces c++14 namespace-organisation


【解决方案1】:

我今天早上启动了 VS,问题自行消失了。

为了确保我可以隔离任何未来的问题,并且由于代码库很大,我回到了第一格,看看我是否可以防止错误:

  • 从项目中排除与问题无关的所有代码文件。
  • 注释掉了相关文件中与问题没有直接关系的代码。
  • 在最小上下文中重写了类(使用智能指针)。

到目前为止,一切都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2016-04-10
    • 2018-01-05
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多