Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加命名空间将删除对类私有成员的好友访问_C++_Class_Namespaces_Friend - Fatal编程技术网

C++ 添加命名空间将删除对类私有成员的好友访问

C++ 添加命名空间将删除对类私有成员的好友访问,c++,class,namespaces,friend,C++,Class,Namespaces,Friend,我有一个向量类,分为声明(.h)和实现(.cpp)文件: 及 现在我想给我的类添加一个名称空间。接下来,我对上述两个文件进行了以下更改: // a_vector.h namespace a { class Vector { private: float f[4]; public: ... // friend operator overloads

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

现在我想给我的类添加一个名称空间。接下来,我对上述两个文件进行了以下更改:

// 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);
    }
}

现在,对于*运算符重载的第一个定义,我得到一个调试错误,该定义声明“'f'是'a::Vector'的私有成员”。我以为好友定义可以访问类的私有成员?如果我在命名空间中没有Vector类,它就可以正常工作。将Vector类放在命名空间中如何改变friends的工作方式

编辑:


在下面添加了答案。

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

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

我也有同样的问题。解决方案的一部分是,在cpp文件中声明并定义一个不在a::命名空间中的函数时,声明一个友元函数a::operator*。因此,它不是您在头文件中声明的友元函数。用::operator*替换operator*可能会解决这个问题。这似乎可以解决问题!谢谢,我也有同样的问题。解决方案的一部分是,在cpp文件中声明并定义一个不在a::命名空间中的函数时,声明一个友元函数a::operator*。因此,它不是您在头文件中声明的友元函数。用::operator*替换operator*可能会解决这个问题。这似乎可以解决问题!谢谢
// 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;
}
// 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;
}