C++ C++;CRTP(模板模式)问题

C++ C++;CRTP(模板模式)问题,c++,templates,crtp,C++,Templates,Crtp,下面的代码没有编译,问题在于T::rank不能在父模板中访问(我认为)或未初始化 你能确切地告诉我问题出在哪里吗? 明确地传递等级是唯一的方法吗?或者有没有直接查询张量类的方法 多谢各位 #include <boost/utility/enable_if.hpp> template<class T, // size_t N, class enable = void> struct tensor_operator; // template<cla

下面的代码没有编译,问题在于
T::rank
不能在父模板中访问(我认为)或未初始化

你能确切地告诉我问题出在哪里吗? 明确地传递等级是唯一的方法吗?或者有没有直接查询张量类的方法

多谢各位

#include <boost/utility/enable_if.hpp>

template<class T, // size_t N,
         class enable = void>
struct tensor_operator;

// template<class T, size_t N>
template<class T>
struct tensor_operator<T, typename boost::enable_if_c< T::rank == 4>::type > {
    tensor_operator(T &tensor) : tensor_(tensor) {}
    T& operator()(int i,int j,int k,int l) {
        return tensor_.layout.element_at(i, j, k, l);
    }
    T &tensor_;
};

template<size_t N, typename T = double>
// struct tensor : tensor_operator<tensor<N,T>, N> {
struct tensor : tensor_operator<tensor<N,T> > {
    static const size_t rank = N;
};

 tensor <4> D;  // compiler attempts to instantiate undefined template, not specialization
#包括
模板
结构张量算子;
//模板
模板
结构张量算子::类型>{
张量_算子(T&张量):张量_(张量){}
运算符()(int i,int j,int k,int l){
(i,j,k,l)处的返回张量元素布局;
}
T&张量;
};
模板
//结构张量:张量算子{
结构张量:张量算子{
静态常量大小\u t秩=N;
};
张量D;//编译器试图实例化未定义的模板,而不是专门化

我知道解决方法,但是我对自我教育的模板实例化机制感兴趣

我是这里唯一一个研究无限递归的人吗

  • tensor
    依赖于
    tensor\u运算符
  • tensor\u运算符
    依赖于
    tensor
我不记得我使用
派生的
类属性来决定是否实例化
,但在我看来这确实会导致无限递归的发生

以下是gcc 3.4.2中的错误:

 In instantiation of `tensor<4ul, double>':
41:   instantiated from here
33: error: invalid use of undefined type
                          `struct tensor_operator<tensor<4ul, double>, void>'
19: error: declaration of `struct tensor_operator<tensor<4ul, double>, void>'
在“张量”的实例化中:
41:从这里实例化
33:错误:未定义类型的使用无效
`结构张量算子'
19:错误:“结构张量_运算符”的声明

这里的问题似乎是
tensor_操作符的实例化取决于
tensor_操作符的实例化

在CRTP中,基类模板利用了成员函数体(定义)这一事实在声明后很长一段时间才实例化。在您的代码中,基类依赖于不完整的类型。

这可能与我在visual studio中发现的此错误有关吗?@kirill g++4.3。我忘记添加实例化的最后一行,已修复now@evan我不认为这是递归问题,我想可能是因为在实例化父模板后指定了秩,但它根本不存在?这个答案确实正确。它会导致
T::rank
的SFINAE失败(因为
::rank
成员尚未声明)因为实例化点在
tensor
的实例化点之前。有关相关问题的详细信息,请参阅。