2

以下代码无法编译,问题在于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

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

4

2 回答 2

2

我是唯一一个在这里看到无限递归的人吗?

  • tensor<N,T>取决于tensor_operator< tensor<N,T> >
  • tensor_operator< tensor<N,T> >取决于tensor<N,T>

我不记得我使用Derived类属性来决定是否要实例化的情况Base,但在我看来,这确实会导致无限递归的发生。

这是 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>'

这里的问题似乎是实例化tensor_operator<N,T>取决于tensor_operator<N,T>......

于 2010-05-19T07:06:36.330 回答
2

在 CRTP 中,基类模板利用了成员函数体(定义)在声明之后很久才实例化的事实。在您的代码中,基类取决于不完整的类型。

于 2010-05-19T07:39:39.840 回答