В вашей функции
template<typename T, int N>
T operator>>(ifstream &os, T v);
нет способа вывести значение для параметра шаблона N
.(Это работает для других функций, принимающих параметр const Arr<T,N>&
, потому что компилятор может сравнить этот тип параметра с типом аргумента, таким как Arr<float, 9>
и определить, что T
равно float
, а N
равно 9
.)
Таким образом, вы можете удалить шаблонный параметр int N
... но это действительно плохая идея - определить шаблонную функцию, которая говорит, как вообще получить любой тип объекта из ifstream
.Многие встроенные типы, стандартные типы библиотек и пользовательские типы определяют свои собственные версии operator>>
, в которых говорится, как получить их из std::istream
или, в более общем случае, из std::basic_istream<CharT, CharTraits>
.И добавление этой перегрузки даст некоторые неочевидные результаты о том, использует ли какой-либо конкретный токен >>
существующие определения или ваш новый.И существующий код, который предполагает использование обычного operator>>
, может внезапно переключиться на использование вашего.
Если вы просто хотите, чтобы место, чтобы определить, что делать с каждым элементом при вводе в Arr<T,N>
, определитефункция с обычным именем для этого, а не operator>>
.
(Менее сломанное, но все еще нестабильное дизайнерское решение, это та часть, где os << some_arr;
делает разные вещи в зависимости от того, статический тип os
это std::ifstream
или нет. Это по крайней мере необычно. И обратите внимание, что это может привести к ситуациям, когда кто-то передает std::ofstream
в функцию, принимающую std::ostream&
, так что внутри этой функции <<
означает не-файл версии, даже если объект потока на самом деле является ifstream
.)