我尝试使用模板类实现 CRTP,但以下示例代码出现错误:
#include <iostream>
template<class T> class Traits
{
public:
typedef typename T::type type; // <- Error
// : "no type named 'type' in 'class MyClass<double, 3u, 3u>'
static const unsigned int m_const = T::m_const;
static const unsigned int n_const = T::n_const;
static const unsigned int size_const = T::m_const*T::n_const;
};
template<class T0> class Crtp
{
public:
typedef typename Traits<T0>::type crtp_type;
static const unsigned int size = Traits<T0>::size_const; // <- This is OK
};
template<typename TYPE, unsigned int M, unsigned int N>
class MyClass : public Crtp< MyClass<TYPE, M, N> >
{
public:
typedef TYPE type;
static const unsigned int m_const = M;
static const unsigned int n_const = N;
};
int main()
{
MyClass<double, 3, 3> x;
std::cout<<x.size<<std::endl;
return 0;
}
我不明白是什么导致了这个问题,也不明白如何解决它。
事实上,我的目标是 CRTP 类必须知道派生类的模板参数,而无需将它们作为 CRTP 类的模板参数传递。
你有什么想法如何实现这个吗?
编辑(与第一个有关):我的 CRTP 类必须能够处理具有不同数量模板参数的派生类