Попытка скомпилировать приведенный ниже код не удалась из-за «конфликтующей декларации». Почему я не могу определить объявленный вперед класс, подобный этому?
Я сделал это, чтобы скрыть, что реализация использует некую библиотеку. Хотя я признаю, что на самом деле это ничего не абстрагирует — вам все равно нужно знать, что использует реализация для выполнения правильного вызова — мне все еще интересно, почему это не работает.
Bar.cpp:
#include "Bar.hpp"
#include "Foo.hpp"
using Foo = ns::Foo;
void Bar::foo(Foo f) {
}
Bar.hpp:
class Foo;
class Bar {
void foo(Foo f);
};
Foo.hpp:
namespace ns {
class Foo {
};
}
Чтобы было ясно, я хочу знать, почему нельзя определить ранее объявленный класс с помощью псевдонима - другими словами, говоря: «используйте это определение там, которое имеет другое имя»