考虑以下代码:
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上尝试)。clang即使没有也不拒绝编译它static_assert
,并抱怨说
error: no member named 'x_derived' in 'Derived'
static constexpr int x_base = Derived::x_derived;
哪个编译器正确(如果有)?有修复代码的好方法吗?
访问嵌套名称要求该类是完整的,但Derived
在这里还不完整:
template<typename Derived>
struct Base {
static constexpr int x_base = Derived::x_derived;
^^^^^^^^^
};
因此代码格式错误。
有一些解决方法。首先,您可以单独将值作为模板参数传入:
template <typename Derived, int x_derived>
struct Base {
static constexpr int x_base = x_derived;
};
struct Derived : public Base<Derived, 5> { };
其次,如果可能的话(例如,您不需要x_derived
声明任何成员),可以将值移到函数中以延迟其实例化:
template<typename Derived>
struct Base {
static constexpr int x_base() {
static_assert(Derived::x_derived > 1, "Oops");
return Derived::x_derived;
}
};
struct Derived : public Base<Derived> {
static constexpr int x_derived = 5;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句