我声明了一个全局移位运算符,但由于某种原因,编译器无法扣除该类型。
template<class T, size_t N>
std::istream& operator >>(std::istream& stream, std::array<T, N>& array);
相反,它尝试使用带有std::istream&&
的重载作为第一个参数。
编辑:我通过
调用void myns::subns::Object::Func(std::istream& stream) {
stream >> array;
}
其中数组为std::array<size_t, 2>
。
实际上,当我尝试将其隔离时,它会编译 - 但在我的代码中,gcc(4.7)抱怨error: cannot bind ‘std::istream {aka std::basic_istream<char>}’ lvalue to ‘std::basic_istream<char>&&’
有人可以向我解释为什么扣除不起作用或我怎么强制调用函数重载?
答案 0 :(得分:0)
如果在命名空间中找不到operator>>
,则编译器会在与您使用的参数关联的命名空间中查找运算符。在这种情况下,它们都来自命名空间std,而不是来自全局命名空间。因此,不会搜索全局命名空间。
当您明确调用::operator>>(istream, array)
时,会查看全局命名空间(正如您特别要求的那样)。