添加命名空间会删除对类私有成员的好友访问权限

Adding namespace removes friend access to class private members

本文关键字:成员 好友 访问 权限 访问权 命名空间 删除 添加      更新时间:2023-10-16

我有一个 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 的文章之后,我对上述两个文件进行了以下更改:

// 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:: 命名空间中的函数。因此,它不是您在头文件中声明的 friend 函数。将运算符*替换为a::operator*应该可以解决此问题。