【发布时间】:2014-01-28 02:33:49
【问题描述】:
在考虑如何在 C++11 中改进 CRTP 时,我以以下代码结束:
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 没有真正的依赖关系这一事实是否意味着模板别名不是依赖类型?这在标准中的什么地方规定?
【问题讨论】:
标签: c++ templates c++11 language-lawyer