添加命名空间会删除对类私有成员的好友访问权限
Adding namespace removes friend access to class private members
我有一个 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*应该可以解决此问题。
相关文章:
- 为什么派生类的好友不能使用受保护的成员?
- 消除好友和成员二进制运算符的歧义
- 好友功能 - 成员无法访问
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 好友成员函数可以在单独的文件中使用吗?
- 处于默认参数位置的 Lambda 无法访问好友成员。这是编译器错误吗?
- 作为好友的非模板类的模板成员
- 好友 c++ 不适用于私有成员
- 好友与成员运算符重载的优先级
- 好友功能没有访问私人成员
- 嵌套类的类内好友是否可以访问外部类成员?
- 运算符<<不能使用其好友数组的 IT 成员
- 当我将一个类声明为其他类的成员时出现错误。 错误:声明好友时必须使用类键
- C++:将模板参数的模板类型成员加为好友的语法正确吗
- 好友功能无法访问私人数据成员
- 好友和静态成员函数具有什么样的成员访问权限
- 成员无法使用好友功能访问
- 通过好友访问受保护的成员
- 为什么我不能使这个成员函数成为另一个类的好友?