Как заявил Дирк Джентли, GCC не выполняет контроль доступа при создании экземпляров шаблонных структур / классов, вложенных в другие (шаблонные) структуры / классы.
Один из способов обойти это - заключить их вне шаблонная структура:
template<int I> class MyTemplate
{
struct PT
{
template<int, typename = void> struct InnerTemplate;
// ... specialisations here ...
};
public:
typedef typename PT::template InnerTemplate<I>::SomeType SomeType;
};
typedef MyTemplate<1>::PT::InnerTemplate<1> ThisWontWork;
Последняя строка не скомпилируется с ошибкой:
error: 'struct MyTemplate<1>::PT' is private within this context
Я допускаю, что это ужасно, особенно с использованием PT::template
но, похоже, это эффективно предотвращает создание клиентами шаблонов помощников, к которым они не предназначены, поэтому стоит попробовать.