Полагаю, самый простой способ сделать это - переместить общие объявления в дополнительный файл и затем включить его дважды:
A_detail.h:
// No `#pragma once` here!
class A {
doDifferentFoo();
doCommonBar(); // this one is common between two impls;
};
Ах:
#pragma once
namespace app {
namespace trusted {
#include "a_detail.h"
}
namespace untrusted {
#include "a_detail.h"
}
}
A-untrusted.cpp:
#include "a.h"
namespace app { namespace untrusted {
// ...
} }
A-trust.cpp:
#include "a.h"
namespace app { namespace trusted {
// ...
} }
A-common_detail.cpp (возможно, выберите другое окончание файла;не должен быть скомпилирован как единица перевода):
// common definitions/declarations without `namespace`
A-common.cpp:
namespace app {
namespace untrusted {
#include "A-common_detail.cpp"
}
namespace trusted {
#include "A-common_detail.cpp"
}
}
Я не уверен, что это того стоит.В качестве альтернативы вы можете (в каждом файле с общим кодом) использовать макрос для всего общего кода и дважды вызывать его для двух пространств имен.Однако вы сказали, что не хотите использовать макросы.
Нет способа сделать это без помощи препроцессора, потому что каждое объявление (только с одним декларатором) объявляет ровно одно имя в одной области видимости..