C++ CRTP(шаблон шаблона) вопрос

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

Решение

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

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

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

Другие вопросы по тегам