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