Код, который вы перечислили, не будет компилироваться, так как вы по сути пытаетесь реализовать конструктор T
вне определения T
; или, если это фундаментальный тип или массив, это имеет еще меньше смысла.
Вместо этого вы можете реализовать оператор приведения в своем матричном классе - либо добавив его в общий шаблон, либо специализировав matrix
для M = 1 и N = 1.
Первый вариант будет выглядеть так:
template<int M, int N, typename T=double>
class matrix{
// ...
operator T() const {
static_assert(M == 1 and N==1,
"Attempting to treat a matrix with multiple cells as a scalar");
// code to return the single matrix element
}
}
и второй:
template<int M, int N, typename T=double>
class matrix{
// ...
}
template<typename T=double>
class matrix<1, 1, T>{
// ... some code duplication here with the main template; or maybe
// actually have different implementation banking on the fact that
// it's really just a scalar.
operator T() const {
// code to return the single matrix element
}
}
но, честно говоря, я не думаю, что я бы порекомендовал какой-либо из этих вариантов. Я бы, вероятно, сделал одно из следующего:
- Изменить функцию, которая принимает T так, что она может «естественно» принимать матрицы 1x1 (например, с помощью шаблонов)
- Изменить функцию, которая принимает T так, что она может «естественно» принимать любую матрицу. Многие скалярные работы имеют интересные обобщения на матрицы.
- Откровенно расскажите о преобразовании, возможно, написав
template <typename T> T as_scalar(const matrix<1,1,T> m)
функцию.