【发布时间】:2020-01-19 14:02:18
【问题描述】:
在输入命名空间时,我遇到了模板运算符重载的问题。考虑添加数组:
// overloads.hpp
#include <array>
namespace mylib {
template <size_t N>
using DoubleArray = std::array<double,N>;
template <size_t N>
DoubleArray<N> operator+( const DoubleArray<N>& lhs, const DoubleArray<N>& rhs ) {return DoubleArray<N>();}
}
在namespace mylib 中进行测试可以正常工作。
// test.cpp
#include "overloads.hpp"
namespace mylib {
void test()
{
DoubleArray<3> a({1.0,0.0,0.0});
DoubleArray<3> b({0.0,1.0,0.0});
DoubleArray<3> c(a+b); // <-- ok
}
}
现在假设我在命名空间mylib::mysublib 中有一个Complex 类,它有自己的operator+ 和来自DoubleArray 的构造函数(这个构造函数必须是显式的以防止隐式转换):
// nested.cpp
#include "overloads.hpp"
namespace mylib {
namespace mysublib {
struct Complex
{
Complex() {};
explicit Complex( const DoubleArray<2>& components );
DoubleArray<2> _components;
};
Complex operator+(const Complex& rhs, const Complex& lhs) {return Complex();}
void testNested()
{
DoubleArray<2> a({1.0,0.0});
DoubleArray<2> b({0.0,1.0});
DoubleArray<2> c(a+b); // <-- no match for ‘operator+’
DoubleArray<2> d( mylib::operator+(a,b) ); // <-- ok
}
}
}
错误信息:
error: no match for ‘operator+’ (operand types are ‘mylib::DoubleArray<2> {aka std::array<double, 2>}’ and ‘mylib::DoubleArray<2> {aka std::array<double, 2>}’)
DoubleArray<2> c(a+b); // <-- no match for ‘operator+’
为什么从嵌套命名空间调用时找不到重载的运算符?重载的全部意义(在这个例子中)将是一个干净的语法。关于如何使其工作的任何想法,或者是否有可能?
【问题讨论】:
-
您可能需要添加 [language-lawyer] 标签。 ADL 查找 en.cppreference.com/w/cpp/language/adl 让我头疼
-
请在帖子中包含您的错误信息。此外,
operator+缺少其定义。添加operator+的函数定义后我看不到任何错误。 -
@Maverobot 你是对的,它确实编译了。然后问题变得有点复杂,我更新了我的问题:我在嵌套命名空间中引入了一个类,它有自己的重载并且破坏了整个事情。
-
您希望调用
DoubleArray<N>重载吗?
标签: c++ namespaces operator-overloading overload-resolution