相同模板 class 但模板类型不同的受保护成员

Protected members of same template class but different template types

我有一个 Matrix2d 模板 class 并且每个 Matrix2d 对象都是一个 std::vector 在引擎盖下。为了速度和简单性,我经常直接在方法中访问 std::vector。当我试图重载 operator == 以使其进行逐个元素比较并使其 return 成为 Matrix2d<bool>.

时,我遇到了一个问题
template <class T>
class Matrix2d {
protected:
   std::vector<T> vec;

public:
    Matrix2d<bool> operator==(const Matrix2d<T>& rhs) const
    {
        Matrix2d<bool> mat(numRows, numCols);

        for (unsigned index=0; index<vec.size(); index++) {
            mat.vec[index] = vec[index] == rhs.vec[index];
        }
        return mat;
    }
};

问题是 Matrix2d<T> 对象无法访问 Matrix2d<bool> 的受保护成员。显然,不同的模板类型使编译器将其视为不同的 class,因此它无法访问受保护的成员。是否有一种干净的方法允许 Matrix2d<T> 对象访问 Matrix2d<bool> 对象的受保护成员?

P.S。显然我没有包含足够的代码来使它可编译,我只是想包含关键元素。如果有人想要可编译的代码,请告诉我。

事实上,matrix2d<bool>matrix2d<int> 是不相关的类型,即使它们来自相同的模板。

要允许对方访问私有成员,您可以添加:template <typename U> friend class Matrix2d;.

您可能只为 matrix2d<bool> 这样做,但我怀疑它会产生太多重复。

template <class T>
class Matrix2d {
protected:
   std::vector<T> vec;
   std::size_t numRows;
   std::size_t numCols;
public:
    template <typename U> friend class Matrix2d;

    Matrix2d(std::size_t numRows, std::size_t numCols);

    Matrix2d<bool> operator==(const Matrix2d<T>& rhs) const
    {
        Matrix2d<bool> mat(numRows, numCols);

        for (unsigned index=0; index<vec.size(); index++) {
            mat.vec[index] = vec[index] == rhs.vec[index];
        }
        return mat;
    }
};