gpt4 book ai didi

c++ - 如何在另一个 C++ 命名空间内的全局命名空间中定义 friend ?

转载 作者:IT老高 更新时间:2023-10-28 21:41:55 37 4
gpt4 key购买 nike

我想在全局命名空间中定义一个二元运算符。运营商适用于在另一个命名空间中定义的类,运算符(operator)应该得到访问该类的私有(private)成员。我的问题是我没有知道如何在类定义中使全局运算符成为 friend 时对其进行作用域。

我尝试了类似的方法:

namespace NAME
{
class A {
public:
friend A ::operator * (double lhs, const A& rhs);
private:
int private_var;
};
}

A operator * (double lhs, const A& rhs)
{
double x = rhs.private_var;
...
}

编译器 (g++ 4.4) 不知道如何处理它。好像这条线

friend A ::operator * ()

被评估为类似(伪代码)

(A::operator)

而不是

(A) (::operator)

如果我在操作符的声明中省略::编译工作,但操作符在命名空间 NAME 中,而不是在全局命名空间中。

在这种情况下如何限定全局命名空间?

最佳答案

首先,请注意您的运算符声明缺少 A 的命名空间限定:

NAME::A operator * (double lhs, const NAME::A& rhs)

然后决定性的技巧是像这样在 friend 声明中添加括号,就像您在“伪代码”中提出的那样

friend A (::operator *) (double lhs, const A& rhs);

为了让它全部编译,你需要一些前向声明,到达这个:

namespace NAME
{
class A;
}

NAME::A operator * (double lhs, const NAME::A& rhs);

namespace NAME
{
class A {
public:
friend A (::operator *) (double lhs, const A& rhs);
private:
int private_var;
};
}

NAME::A operator * (double lhs, const NAME::A& rhs)
{
double x = rhs.private_var;
}

不过,Alexander 是对的——您可能应该在与其参数相同的命名空间中声明运算符。

关于c++ - 如何在另一个 C++ 命名空间内的全局命名空间中定义 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2207219/

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