如何使用c ++中另一个命名空间中定义的操作

时间:2015-05-06 11:32:36

标签: c++ namespaces operator-keyword

我对命名空间中的操作有一个定义,我想在另一个名称空间中使用它,我该怎么做:

例如,假设我有:操作定义:

namespace op
{
       inline cv::Matx21f operator/(const cv::Matx21f &v, float a)
    {
        return cv::Matx21f(v(0) / a, v(1) / a);
    }
}

我将代码放在另一个名称空间中:

namespace code
   {
          void my function()
           {
              cv::Matx21f data=getData();
              cv::Matx21f result=data/10;
             }
   }

我收到错误

  cv::Matx21f result=data/10;

as / is not define。

我知道我可以使用:

  use namespace op;

但如果可能,我不想这样做。

我可以用任何方式解决类似于使用函数进行名称解析的操作(op :: /无效)

2 个答案:

答案 0 :(得分:2)

您有三种选择。您可以直接引入运营商:

       void my function()
       {
          using op::operator/;
          cv::Matx21f data=getData();
          cv::Matx21f result=data/10;
       }

您可以直接致电:

       cv::Matx21f result = op::operator/(data, 10);

但理想情况下,您只需将operator/放入正确的命名空间:

namespace cv {
    inline Matx21f operator/(const Matx21f &v, float a);
}

这样,cv::Matx21f result=data/10;就可以了,因为找到了运营商。

答案 1 :(得分:0)

请考虑使用此代码:

namespace WhateverLibraryNs
{
    inline namespace operations
    {
        inline cv::Matx21f operator/(const cv::Matx21f &v, float a)
        {
            return cv::Matx21f(v(0) / a, v(1) / a);
        }
    }
}

WhateverLibraryNs中的客户端代码将无缝使用运算符(因为它是内联命名空间)。

WhateverLibraryNs之外的客户端代码将有四个选项:

首先,完全符合运营商资格:

auto result = WhateverLibraryNs::operations::operator/(v, a);

其次,仅导入操作命名空间(有关类似解决方案,请参阅std :: string_literals命名空间):

using namespace WhateverLibraryNs::operations;
auto result = v / a;

第三,别名为内部命名空间:

namespace ops = WhateverLibraryNs::operations;
auto result = ops::operator/(v, a);

第四,仅导入运营商:

using WhateverLibraryNs::operations::operator/;
auto result = v / a;