Собственный шаблон для скалярного типа не может скомпилировать операцию подматрицы фиксированного размера - PullRequest
1 голос
/ 05 января 2020

Может кто-нибудь объяснить, почему этот MWE не компилируется:

template<typename Scalar>
class ScalarTemplate {
public:
    static Eigen::Matrix<Scalar, 2, 1> tail(){
        Eigen::Matrix<Scalar, 3, 1> m;
        return m.tail<2>();
    }
};

int main() {
    auto tail = ScalarTemplate<float>::tail();
}

Довольно просто, все соответствующие Eigen-шаблоны должны быть инициализированы с float и все размеры контейнеров должны быть известны во время компиляции. Тем не менее, это приводит к следующему:

../src/main.cpp: In static member function 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail()':
../src/main.cpp:24:26: error: expected primary-expression before ')' token
         return m.tail<2>();
                          ^
../src/main.cpp: In instantiation of 'static Eigen::Matrix<_Scalar, 2, 1> ScalarTemplate<Scalar>::tail() [with Scalar = float]':
../src/main.cpp:29:40:   required from here
../src/main.cpp:24:22: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
         return m.tail<2>();

То же самое происходит со всеми операциями с подматрицами, насколько я могу судить. Eigen - версия 3.3.7.

1 Ответ

1 голос
/ 05 января 2020

Сообщение об ошибке немного сбивало с толку, поэтому мне потребовалось некоторое время, чтобы выяснить тот факт, что операции с подматрицами сами являются вызовами шаблона внутри класса шаблона, поэтому правильный вызов:

m.template tail<2>();
...