C++ 添加命名空间将删除对类私有成员的好友访问
我有一个向量类,分为声明(.h)和实现(.cpp)文件: 及 现在我想给我的类添加一个名称空间。接下来,我对上述两个文件进行了以下更改: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
// 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;
}