Я редко, если вообще когда-либо видел закрытый typedef, но, думаю, в этом нет ничего плохого в отношении идеи инкапсуляции. Однако, если у вас есть публичная функция, которая использует typedef, то не делает ли это typedef частью вашего интерфейса?
Я полагаю, что вы могли бы использовать закрытый typedef внутри некоторых функций-членов или интерфейсов закрытых функций-членов. Но если вы хотите использовать его в публичном методе, имеет смысл только, чтобы typedef был публичным.
Я не знаю, что стандарт говорит об этом предмете, но я думаю, это одна из немногих серых областей. Я бы предположил, что это зависит от реализации компилятора от того, как обрабатывать определения типов в классе, который вы определяете, допустимо ли использование закрытого определения типов в публичном методе (или вообще вообще приемлемо). Чтобы быть в безопасности, я бы просто сделал это публичным.
Если вы беспокоитесь по поводу раскрытия typedef, не используйте его в прототипе какой-либо общедоступной функции-члена (и все же это может быть отклонено некоторым компилятором). Если вы беспокоитесь о столкновении имен, не делайте этого, потому что любой внешний код в любом случае должен будет разрешить область действия с фактическим именем класса.
Я думаю, вы просто слишком далеко зашли в идею инкапсуляции.