扣除失败

时间:2012-06-22 21:11:24

标签: c++ templates gcc

我声明了一个全局移位运算符,但由于某种原因,编译器无法扣除该类型。

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>&&’

有人可以向我解释为什么扣除不起作用或我怎么强制调用函数重载?

1 个答案:

答案 0 :(得分:0)

如果在命名空间中找不到operator>>,则编译器会在与您使用的参数关联的命名空间中查找运算符。在这种情况下,它们都来自命名空间std,而不是来自全局命名空间。因此,不会搜索全局命名空间。

当您明确调用::operator>>(istream, array)时,查看全局命名空间(正如您特别要求的那样)。