我有一个 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 类放在命名空间中会如何改变朋友的工作方式?
编辑:
在下面添加了答案。