Я ответил на этот вопрос, используя конструкцию С++, с которой я не знаком. Я хочу знать, является ли это законным или разрешено как g++ (6.3.0), так и clang++ (3.5.0) по ошибке. Пример доступен онлайн:
#include <iostream>
template <typename T>
struct Base
{
using Type = int;
};
template <typename T>
struct intermediate : Base<T>
{
// 'Type' is not defined here, which is fine
};
template <typename T>
struct Derived : intermediate<T>
{
using Type = typename Derived<T>::Type; // Is this legal?
// using Type = typename intermediate<T>::Type; // Normal way of doing it
};
int main()
{
Derived<void>::Type b = 1;
std::cout << b << std::endl;
}
Обновление
Как указано в комментариях (underscore_d) <T>
не требуется в классе Derived
. То есть, это совершенно нормально:
using Type = typename Derived::Type;