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が、これにより無限再帰が発生するように思われます。

gcc3.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 に答える