我对命名空间中的操作有一个定义,我想在另一个名称空间中使用它,我该怎么做:
例如,假设我有:操作定义:
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 :: /无效)
答案 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;