3

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

#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;
}

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

4

1 回答 1

3

对于 VS2017 版本 15.9,已经有一个关于此问题的错误,标题为:未找到内联命名空间名称

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

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

于 2019-03-15T12:05:17.613 回答