我正在使用CRPT,并且需要访问派生类中定义的基类中的参数。它在成员函数中使用时有效,但在(我猜是)编译时表达式中无效(定义类型时会出现问题)。以下代码说明了该问题:
#include <iostream>
#include <array>
template <typename impl_t>
struct base {
// no complaints
void print () {
std::cout << "Base, impl_t::i_q = " << impl_t::i_q << std::endl;
}
// compiler error:
// clang++: no member named 'i_q' in 'deriv_t'
// g++: incomplete type ‘deriv_t’ used in nested name specifier
using vec_t = std::array<double, impl_t::i_q>;
};
struct deriv_t : public base<deriv_t> {
static const std::size_t i_q = 1;
};
int main () {
deriv_t d;
d.print();
}
我只是想知道这里违反了什么规则?我想出的解决方案是在模板中的i_q
旁边定义impl_t
,但想知道是否有更整洁的方法来解决问题。
解决方案:
感谢Evg,这是解决方案:
template <typename impl_t>
struct traits;
template <typename impl_t>
struct base_t {
void print () {
std::cout << "Base, impl_t::i_q = " << traits<impl_t>::i_q << std::endl;
}
using vec_t = std::array<double, traits<impl_t>::i_q>;
};
struct deriv_t;
template <>
struct traits<deriv_t> {
static const std::size_t i_q = 1;
};
struct deriv_t : public base_t<deriv_t> {
};
答案 0 :(得分:2)
impl_t
在base
中是不完整的类型。您可以使用另一个模板参数或使用类型特征技术来解决该问题:
template<class>
struct traits;
template<>
struct traits<deriv_t>
{
static constexpr std::size_t i_q = 1;
};
...
void print () {
std::cout << "Base, i_q = " << traits<impl_t>::i_q << std::endl;
}
using vec_t = std::array<double, traits<impl_t>::i_q>;
print()
中没有抱怨,因为在实例化时impl_t
成为完整类型。