【发布时间】:2016-04-26 15:42:45
【问题描述】:
考虑以下代码:
template<typename Derived>
struct Base {
static constexpr int x_base = Derived::x_derived;
//static_assert(x_base > 1, "Oops");
};
struct Derived : public Base<Derived> {
static constexpr int x_derived = 5 ;
};
Base<Derived> obj;
这在 gcc 上编译得很好,但如果我取消注释 static_assert 行,它会抱怨
error: incomplete type 'Derived' used in nested name specifier
static constexpr int x_base = Derived::x_derived;
我尝试了从 4.9 到 5.3 的不同版本的 gcc,我得到了同样的错误(你可以在 godbolt here 上试试)。即使没有static_assert,clang 也拒绝编译它,并抱怨
error: no member named 'x_derived' in 'Derived'
static constexpr int x_base = Derived::x_derived;
哪个编译器是正确的(如果有的话)? 有没有修复代码的好方法?
【问题讨论】:
标签: c++ gcc clang crtp static-assert