在 cpp 文件中使用内联命名空间中的类型在 MSVS 中不起作用

Posted

技术标签:

【中文标题】在 cpp 文件中使用内联命名空间中的类型在 MSVS 中不起作用【英文标题】:Using type from inline namespace in cpp file does not work in MSVS 【发布时间】:2019-08-06 11:24:09 【问题描述】:

我的库中有两个版本的错误结构,因此我想使用内联命名空间进行版本控制。

#pragma once
#include <string>

namespace core 
    inline namespace v2 
        struct Error      // <-- new version
            int code;
            std::string description;
        ;
    
    namespace v1 
        struct Error      // <-- old version
            int code;
        ;
    

这是说明我在 Visual Studio 2017 中收到的编译错误的示例。clang 和 gcc 都可以正常工作。

// foo.h
#pragma once
#include "error.h"

namespace core 
    class Foo
    
    public:
        Foo() = default;
        ~Foo() = default;
        void someMethod(Error err);
    ;


// foo.cpp
#include "foo.h"
#include <iostream>

void core::Foo::someMethod(Error err)   // error C2065: 'Error': undeclared identifier
    std::cout << err.code << std::endl;

看起来像 MSVS 中的一个错误,或者我可能遗漏了一些东西。 此代码在 MSVS 上运行良好,没有任何问题:

void core::Foo::someMethod()     // <-- Error is not passed here
    Error err;
    err.code = 42;
    std::cout << err.code << std::endl;

知道为什么我会收到此错误吗?

【问题讨论】:

也许void core::Foo::someMethod(core::Error err) ? 您始终可以在适当的命名空间内定义函数:namespace core void Foo::somethod(Error err) ... @VTT :他当然可以,而且 OP 可能知道这一点。更大的问题是:MSVC 拒绝这个是错误的吗? 【参考方案1】:

对于 VS2017 版本 15.9 已经提交了一个关于此问题的错误,标题为:Inline namespace name not found

错误报告中建议的解决方法是在函数参数中指定命名空间(例如void core::Foo::someMethod(core::Error err))。

对错误报告的最后评论指出,他们已在即将发布的版本中修复了该问题。 (未提及发布版本)。

【讨论】:

以上是关于在 cpp 文件中使用内联命名空间中的类型在 MSVS 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

链接阶段的多重定义错误

非内联命名空间不能作为内联重新打开

04. 命名空间,函数重载,内联

04. 命名空间,函数重载,内联

命名空间中的并行工作者

用于在 C++ 中管理平台特定代码的内联命名空间技术