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

时间:2012-04-26 21:47:32

标签: c++ class namespaces friend

我有一个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类放在命名空间中会改变朋友的工作方式?

修改

在下面添加了答案。

1 个答案:

答案 0 :(得分:1)

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