【问题标题】:Adding namespace removes friend access to class private members添加命名空间会删除对类私有成员的朋友访问权限
【发布时间】:2012-05-07 16:28:08
【问题描述】:

我有一个 Vector 类分为声明 (.h) 和实现 (.cpp) 文件:

// a_vector.h
class Vector
    {
    private:
        float f[4];

    public: 
        ...
        // friend operator overloads
        friend Vector operator * (const float& s, const Vector& v);
        friend Vector operator * (const Vector& v, const float& s);
}

// a_vector.cpp
...
// friend operator overloads
Vector operator * (const float& s, const Vector& v)
{
    return Vector(s*v.f[0], s*v.f[1], s*v.f[2], s*v.f[3]);
}

Vector operator * (const Vector& v, const float& s)
{
    return s*v;
}

现在我想为我的班级添加一个命名空间。继Danny Kalev's Article之后,我对以上两个文件做了如下改动:

// a_vector.h
namespace a
{
    class Vector
        {
        private:
            float f[4];

        public: 
            ...
            // friend operator overloads
            friend Vector operator * (const float& s, const Vector& v);
            friend Vector operator * (const Vector& v, const float& s);
    }
}

// a_vector.cpp
...
// friend operator overloads
a::Vector operator * (const float& s, const a::Vector& v)
{
    return a::Vector(s*v.f[0], s*v.f[1], s*v.f[2], s*v.f[3]);
}

a::Vector operator * (const a::Vector& v, const float& s)
{
    return s*v;
}

对于 * 运算符重载的第一个定义,我现在收到一个调试错误,指出“'f' 是 'a::Vector' 的私有成员”。我认为朋友定义可以访问班级的私人成员?如果命名空间中没有 Vector 类,它可以正常工作。将 Vector 类放入命名空间会如何改变朋友的工作方式?

编辑:

在下面添加了答案。

【问题讨论】:

  • 我也有同样的问题。部分解决方案是您声明一个友元函数 a::operator* 而在您的 cpp 文件中声明并定义另一个不在 a:: 命名空间中的函数。因此,它不是您在头文件中声明的友元函数。用 a::operator* 替换 operator* 可能会修复它。
  • 这似乎可以解决问题!谢谢。

标签: c++ class namespaces friend


【解决方案1】:

您声明了一个友元函数 a::operator*,而在您的 cpp 文件中您声明并定义了不在 a:: 命名空间中的 另一个 函数。因此,它不是您在头文件中声明的友元函数。用 a::operator* 替换 operator* 应该可以修复它。

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2011-10-12
    • 2021-01-02
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多