作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想在全局命名空间中定义一个二元运算符。运营商适用于在另一个命名空间中定义的类,运算符(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/
我是一名优秀的程序员,十分优秀!