【问题标题】:Access protected members outside class/struct scope?访问类/结构范围之外的受保护成员?
【发布时间】:2019-04-18 10:35:19
【问题描述】:

我有一堆模板结构(Vec3<T>Vec4<T>Mat4<T>、...),并且我正在做大量的运算符重载。我将Mat4<T> * Vec4<T> 定义为通常的矩阵向量乘法。现在我想将Vec4<T> * Mat4<T> 定义为逐行乘法。

我还保护了底层数据结构(我正在使用 SIMD 向量)和结构朋友,以便访问受保护的 data 字段。

问题是我想在Mat4<T> 头文件中定义operator*(const Vec4<T>&, const Mat4<T>&)。通常我会定义一个交换运算符是:

template<typename T>
Vec3<T> operator*(const T & s, const Vec3<T> & v)
{
    return v * s;
}

但在这种情况下,我必须改变行为,我无法访问 Mat4&lt;T&gt;Vec4&lt;T&gt; 的受保护成员。

  • 有没有办法“使函数成为结构的朋友”?
  • 或者,如果Mat4&lt;T&gt; 是不完整的类型,我可以将operator*(const Mat4&lt;T&gt;&amp;) 声明为Vec4&lt;T&gt; 成员(然后在结构定义之后的Mat4&lt;T&gt; 标头中定义它)吗?

注意:我想避免像 const typename Mat4&lt;T&gt;::MT &amp; getData() const; 这样的公共 getter 检索 data 的不可变引用

解决方案

@songyuanyao 的答案对我来说几乎是正确的:

// In both Mat4 and Vec4
template<typename F>
friend Mat4<F> operator*(const Vec4<F> & v, const Mat4<F> & m);

【问题讨论】:

  • 你在这个问题中是否混淆了+*
  • @NeilGatenby 是的,对不起。修复它
  • 声明相同的Mat4&lt;T&gt; operator*(const Vec4&lt;T&gt;&amp;, const Mat4&lt;T&gt;&amp;) 函数作为两个结构的朋友? Like this?

标签: c++ templates struct operator-overloading protected


【解决方案1】:

有没有办法“让函数成为结构的朋友”?

是的,您可以将函数模板的特化声明为friend。例如

// forward declaration
template<typename T>
class Vec4;
template<typename T>
class Mat4;

// declaration
template<typename T>
Vec4<T> operator*(const Vec4<T>&, const Mat4<T>&);

template<typename T>
class Vec4 {  
    // friend declaration  
    friend Vec4<T> operator* <T> (const Vec4<T>&, const Mat4<T>&);
    ...
};

template<typename T>
class Mat4 {    
    // friend declaration  
    friend Vec4<T> operator* <T> (const Vec4<T>&, const Mat4<T>&);
    ...
};

// definition  
template<typename T>
Vec4<T> operator*(const Vec4<T>&, const Mat4<T>&)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2017-08-01
    • 2016-10-01
    • 2014-06-07
    • 1970-01-01
    • 2012-12-01
    • 2019-12-05
    相关资源
    最近更新 更多