gpt4 book ai didi

c++ - 添加命名空间会删除对类私有(private)成员的好友访问权限

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:43 24 4
gpt4 key购买 nike

我有一个 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’的私有(private)成员”。我以为 friend 定义可以访问类(class)的私有(private)成员?如果我在命名空间中没有 Vector 类,它工作正常。将 Vector 类放入命名空间如何改变 friend 的工作方式?

编辑:

在下面添加了答案。

最佳答案

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

关于c++ - 添加命名空间会删除对类私有(private)成员的好友访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com