我有一个Matrix2d
模板类,每个Matrix2d
对象都是引擎盖下的std::vector
。我经常直接在方法中访问std::vector
,以提高速度和简化性。当我尝试重载operator ==
使其进行逐元素比较并返回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>
的 protected 成员。显然,不同的模板类型使编译器将其视为不同的类,因此它无法访问 protected 成员。是否有一种干净的方法允许Matrix2d<T>
对象访问Matrix2d<bool>
对象的 protected 成员?附言显然,我没有包含足够的代码来使其可编译,我只是在尝试包含关键要素。如果有人想要可编译的代码,请告诉我。
最佳答案
的确,matrix2d<bool>
和matrix2d<int>
是不相关的类型,即使它们来自同一模板。
要允许彼此访问私有(private)成员,您可以添加: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;
}
};
关于c++ - 相同模板类但模板类型不同的 protected 成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59430903/