Размышляя, как CRTP может быть улучшен в C++ 11, я закончил со следующим кодом:шаблонов псевдонимов и зависимые имена
template <typename Derived, typename Delayer>
struct derived_value_type
{
typedef typename Derived::value_type type;
};
template <typename Derived>
struct base
{
template <typename Delayer = void>
typename derived_value_type<Derived, Delayer>::type
foo(){ return {}; }
};
struct derived : base<derived>
{
typedef int value_type;
};
#include <iostream>
#include <typeinfo>
int main()
{
derived d;
auto bar = d.foo();
std::cout << typeid(bar).name() << ':' << bar << std::endl;
}
Я считаю, что предыдущий код будет стандартными совместимым, и он компилирует и работает с основными компиляторами (в результате получается i:0
). Однако, когда я использую шаблон псевдоним вместо этого, я получаю ошибку компиляции из-за derived
будучи неполным:
template <typename Derived, typename Delayer>
using derived_value_type = typename Derived::value_type;
/*...*/
template <typename Delayer = void>
derived_value_type<Derived, Delayer>
foo(){ return {}; }
Является ли это ошибка компилятора, или же тот факт, что компилятор может детерминированный, что нет никакого реальных зависимости с Delayer
означает, что псевдоним шаблона не является зависимым типом? Где это указано в стандарте?