【问题标题】:C++: use of overloaded operators in my namespaceC++:在我的命名空间中使用重载运算符
【发布时间】:2015-04-08 10:39:36
【问题描述】:

我正在尝试在库中用 C++ 实现标量积:

namespace Foo
{
    double operator* (vector<double> left, vector<double> right)
    {
        ...
    }
}

但我在主程序中调用它时遇到问题。调用

int main (void)
{
    ...
    double result = Foo::operator* (l, r);
    ...
}

不是一个好的解决方案,而:

int main (void)
{
    ...
    double result = l * r; //l, r are vector<double>
    ...
}

不工作。

using namespace Foo 被认为是全球使用的不良做法。

main 范围内调用我的operator* 函数的好方法是什么?

【问题讨论】:

  • 重载的操作符应该通过 ADL 工作。在 Foo 中编写你自己的向量类。
  • vector * vector 是双精度的,这没有任何意义
  • @billz 使用点积时会这样
  • 您可以在main 中使用use namespace Foo;
  • 最好有一个名为“dot”的方法来明确说明它的作用,而不是为此重载 *。

标签: c++ namespaces operator-overloading


【解决方案1】:

如果您应该像这样重载* 运算符,我不会过多评论。我只想说,这会让很多人感到困惑。

你可以只引入操作符而不是整个命名空间。

using Foo::operator*;
double result = l * r;

对于自定义类,您可以使用ADL (Argument Dependent Lookup),如下所示:

namespace Foo
{
    struct dvector : public vector<double> 
    { };

    double operator*(dvector left, dvector right)
    {
        return 0;
    }
}

int main (void)
{
    Foo::dvector l, r;
    double result = l * r;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多