Использование типа из встроенного пространства имен в файле 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)
)
В последнем комментарии к сообщению об ошибке говорится, что они исправили проблему в следующем выпуске. (Версия релиза не упоминается) .