如何使用在 C++ 的另一个命名空间中定义的操作
How to use an operation which is defined in another namespace in c++
我在一个名称space中定义了一个操作,我想在另一个名称space中使用它,我该怎么做:
例如,假设我有这个:定义的操作:
namespace op
{
inline cv::Matx21f operator/(const cv::Matx21f &v, float a)
{
return cv::Matx21f(v(0) / a, v(1) / a);
}
}
我有另一个名字的代码space as:
namespace code
{
void my function()
{
cv::Matx21f data=getData();
cv::Matx21f result=data/10;
}
}
我在
上遇到错误
cv::Matx21f result=data/10;
as / 未定义。
我知道我可以使用:
use namespace op;
但如果可能我不想这样做。
我可以通过任何方式解析类似于我们可以使用函数进行名称解析的操作(op::/ 无效)
你有三个选择。你可以直接引入操作员:
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;
就可以工作了,因为可以找到运算符。
改为考虑此代码:
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
中的客户端代码将无缝地使用运算符(因为它是一个 inline 命名空间)。
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;
我在一个名称space中定义了一个操作,我想在另一个名称space中使用它,我该怎么做:
例如,假设我有这个:定义的操作:
namespace op
{
inline cv::Matx21f operator/(const cv::Matx21f &v, float a)
{
return cv::Matx21f(v(0) / a, v(1) / a);
}
}
我有另一个名字的代码space as:
namespace code
{
void my function()
{
cv::Matx21f data=getData();
cv::Matx21f result=data/10;
}
}
我在
上遇到错误 cv::Matx21f result=data/10;
as / 未定义。
我知道我可以使用:
use namespace op;
但如果可能我不想这样做。
我可以通过任何方式解析类似于我们可以使用函数进行名称解析的操作(op::/ 无效)
你有三个选择。你可以直接引入操作员:
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;
就可以工作了,因为可以找到运算符。
改为考虑此代码:
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
中的客户端代码将无缝地使用运算符(因为它是一个 inline 命名空间)。
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;