Оператор шаблона класса шаблона требует доступа к другим специализациям
Я реализовал матричный класс с использованием CRTP. Для умножения матриц я хотел бы использовать friend operator*
, Проблема в том, что в соответствии с этим вопросом и моим собственным опытом мне нужно определить operator*
внутри класса, чтобы заставить его работать.
Это означает, однако, что я должен повторно использовать параметры шаблона класса в определении, которое дает доступ только к одной из трех матриц, участвующих в вычислении. Я не могу обеспечить дружбу с другими.
Пример кода:
template<template<unsigned, unsigned> class Child, unsigned M, unsigned N>
class BaseMatrix
{
// This works, but does not give access to rhs or to the return value
template<unsigned L>
friend Child<M, L> operator*(const BaseMatrix<Child, M, N>& lhs, const BaseMatrix<Child, N, L>& rhs)
{
Child<M, L> result;
result.v = lhs.v + rhs.v; // demo, of course
return result;
}
// This compiles, but does not do anything
template<template<unsigned, unsigned> class Child2, unsigned M2, unsigned N2, unsigned L>
friend Child2<M2, N2> operator*(const BaseMatrix<Child2, M2, L>&, const BaseMatrix<Child2, L, N2>&);
// This produces an ambiguous overload
template<unsigned L>
friend Child<M, N> operator*(const BaseMatrix<Child, M, L>& lhs, const BaseMatrix<Child, L, N>& rhs);
double v;
};
template<unsigned M, unsigned N>
class ChildMatrix : public BaseMatrix<ChildMatrix, M, N>
{
};
int main()
{
ChildMatrix<3, 4> a;
ChildMatrix<4, 5> b;
ChildMatrix<3, 5> c = a * b;
return 0;
}
Как я могу предотвратить нарушения доступа к rhs.v
и к result.v
ошибки здесь?
1 ответ
Не использовать friend
за это. Класс матрицы должен представлять свои элементы индивидуально, и этого достаточно для умножения из обычной (не дружественной) функции.