Использование типа из встроенного пространства имен в файле cpp не работает в MSVS - PullRequest
3 голосов
/ 15 марта 2019

У меня есть две версии структуры 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 Ответ

3 голосов
/ 15 марта 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...