2012-06-22 4 views
0

Я объявил глобальный оператор сдвига, но по какой-то причине компилятор не может вычитать тип.Устранение ошибки

template<class T, size_t N> 
std::istream& operator >>(std::istream& stream, std::array<T, N>& array); 

Вместо этого он пытается использовать перегрузку с std::istream&& в качестве первого аргумента.

EDIT: Я призываю через

void myns::subns::Object::Func(std::istream& stream) { 
    stream >> array; 
} 

где массив является std::array<size_t, 2>. Действительно, когда я пытаюсь его изоляции компилирует - но в моем коде НКУ (4,7) жалуется error: cannot bind ‘std::istream {aka std::basic_istream<char>}’ lvalue to ‘std::basic_istream<char>&&’

Может кто-нибудь объяснить мне, почему вычет не работает или как я могу заставить вызвать перегрузку функции?

+0

Как вы _try_, чтобы вызвать его? –

+0

Работает для меня: http://ideone.com/n2D5o – mfontanini

+0

@mfontanini Спасибо. Я не понимаю, почему он работает изолированно. – abergmeier

ответ

0

Если он не находит operator>> в пространстве имен, из которого он вызывается, компилятор ищет оператор в пространствах имен, связанных с параметрами, которые вы используете. В этом случае все они исходят из пространства имен std, а не из глобального пространства имен. Поэтому глобальное пространство имен не выполняется.

Когда вы явно вызываете ::operator>>(istream, array), оно делает смотрите в глобальном пространстве имен (как вы его специально попросили).

+0

Итак, правильная вещь здесь - вывести класс-оболочку из коллекции 'std', а затем написать оператор пространства имен? – abergmeier

+0

Наверное, да. Печать стандартных контейнеров сложна, так как у них нет каких-либо перегрузок 'operator >>'. Возможным решением является их создание и печать закрывающего типа. –

Смежные вопросы