Есть ли обходной путь для этого?
MemberType
является типом, зависящим от параметра шаблона, поэтому обязательно необходимо передать через содержащийся шаблон шаблонный параметр, чтобы определить его
typename A<SomeType>::template MemberType<AnotherType> m2;
Учитывая, что вас не интересует внешний параметр SomeType
, лучший обходной путь, который я могу себе представить, это использование using
следующим образом (или что-то подобное)
template <typename T>
using MemberType_t = typename A<T>::template MemberType<T>;
для уменьшения набора текста.
Ниже приведен упрощенный пример полной компиляции
#include <type_traits>
class Dummy { };
template <typename>
struct A
{
template <typename T2>
struct MemberType : public T2
{ T2 t2; };
};
template <typename T>
using MemberType_t = typename A<T>::template MemberType<T>;
int main ()
{
typename A<Dummy>::template MemberType<Dummy> m1;
MemberType_t<Dummy> m2; // compile
static_assert( std::is_same<decltype(m1), decltype(m2)>::value, "!" );
}