Использование типа из встроенного пространства имен в файле cpp не работает в MSVS

У меня есть две версии структуры Error в моей библиотеке, поэтому я хочу использовать встроенные пространства имен для управления версиями.

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

Есть идеи, почему я получаю эту ошибку?

1 ответ

Решение

Уже существует ошибка, поданная по этому вопросу для VS2017 версии 15.9 под названием: не найдено имя встроенного пространства имен.

Обходной путь, предложенный в отчете об ошибке, состоит в том, чтобы указать пространство имен также в параметре функции (например, void core::Foo::someMethod(core::Error err))

В последнем комментарии к сообщению об ошибке говорится, что они исправили проблему в следующем выпуске. (Версия релиза не упоминается) .

Другие вопросы по тегам