C ++ CRTP (шаблон шаблона) вопрос - PullRequest
2 голосов
/ 19 мая 2010

следующий фрагмент кода не компилируется, проблема в 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

Я знаю обходной путь, однако меня интересует механизм создания шаблонов для самообразования

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

В CRTP шаблон базового класса использует тот факт, что тела функций-членов (определения) создаются не раньше, чем через долгое время после их объявлений. В вашем коде базовый класс зависит от неполного типа.

2 голосов
/ 19 мая 2010

Я единственный, кто смотрит на бесконечную рекурсию здесь?

  • 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> ...

...