在查找期间在std命名空间中拖动外部命名空间

Outer namespace dragging in std namespace during lookup

本文关键字:命名空间 拖动 外部 std 查找      更新时间:2023-10-16

我目前正在重构一些旧代码以满足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;
    };
}

这个不再有效。智能感知报告错误:

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

构造函数声明中的

。(但不是m_blah的声明)

…什么?为什么标准库名称空间被拉到N中?!

版本信息:

  • VS2015 Community Edition (RTM) Version 14.0.23107.0 D14REL
  • 开发者命令提示符报告cl版本:编译器版本19.00.23026

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

在尝试确保我可以隔离任何未来的问题,因为代码库是巨大的,我回到原点,看看我是否可以防止错误:

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

一切顺利