template<typename T>
quaternion<T> operator + (quaternion<T> const & q);
Этот унарный оператор просто возвращает q.
template<typename T>
quaternion<T> operator - (quaternion<T> const & q);
Этот унарный оператор возвращает противоположность q.
template<typename T> quaternion<T> operator + (T const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, T const & rhs);
template<typename T> quaternion<T> operator + (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, quaternion<T> const & rhs);
Эти операторы возвращаются<quaternion<T>(lhs)+=
     rhs>.
template<typename T> quaternion<T> operator - (T const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, T const & rhs);
template<typename T> quaternion<T> operator - (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, quaternion<T> const & rhs);
Операторы возвращаются<quaternion<T>(lhs)-=
     rhs>.
template<typename T> quaternion<T> operator * (T const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, T const & rhs);
template<typename T> quaternion<T> operator * (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, quaternion<T> const & rhs);
Операторы возвращаются<quaternion<T>(lhs)*=
     rhs>.
template<typename T> quaternion<T> operator / (T const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, T const & rhs);
template<typename T> quaternion<T> operator / (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, quaternion<T> const & rhs);
Операторы возвращаются<quaternion<T>(lhs)/=
     rhs>. Это, конечно, ошибка, чтобы разделить на ноль.
template<typename T> bool  operator == (T const & lhs, quaternion<T> const & rhs);
template<typename T> bool  operator == (quaternion<T> const & lhs, T const & rhs);
template<typename T> bool  operator == (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> bool  operator == (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> bool  operator == (quaternion<T> const & lhs, quaternion<T> const & rhs);
Они возвращаются истинными тогда и только тогда, когда четыре компонента<quaternion<T>(lhs)>равны их аналогам в<quaternion<T>(rhs)>. Как и в случае с любым объектом плавающего типа, это по существу бессмысленно.
template<typename T> bool  operator != (T const & lhs, quaternion<T> const & rhs);
template<typename T> bool  operator != (quaternion<T> const & lhs, T const & rhs);
template<typename T> bool  operator != (::std::complex<T> const & lhs, quaternion<T> const & rhs);
template<typename T> bool  operator != (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> bool  operator != (quaternion<T> const & lhs, quaternion<T> const & rhs);
Они возвращаются истинными тогда и только тогда, когда они ложны6. Как и в случае с любым объектом плавающего типа, это по существу бессмысленно.
template<typename T, typename charT, class traits>
::std::basic_istream<charT,traits>& operator >> (::std::basic_istream<charT,traits> & is, quaternion<T> & q);
Извлекает кватернион q одной из следующих форм (с a, b, c и d типа<T>):
<a (a), (a,b), (a,b,c), (a,b,c,d) (a,(c)), (a,(c,d)), ((a)), ((a),c),
      ((a),(c)), ((a),(c,d)), ((a,b)), ((a,b),c), ((a,b),(c)), ((a,b),(c,d))>
Входные значения должны быть конвертируемы в<T>. Если вы столкнулись с плохим входом, звоните<is.setstate(ios::failbit)>(что может привести к провалу (27.4.5.3)).
Возвращение:<is>.
Обоснованием для списка принятых форматов является то, что либо у нас есть список до четырех реалов, либо у нас есть пара сложных чисел, и в том случае, если он оформлен как правильное комплексное число, то его следует принять. Таким образом, потенциальные двусмысленности отбрасываются (например, (a,b) есть (a,b,0,0), а не (a,0,b,0), т.е. он разбирается как список двух действительных чисел, а не двух комплексных чисел, которые имеют воображаемые части, равные нулю.
template<typename T, typename charT, class traits>
::std::basic_ostream<charT,traits>& operator << (::std::basic_ostream<charT,traits> & os, quaternion<T> const & q);
Вставляет кватернион q в поток<os>, как если бы он был реализован следующим образом:
template<typename T, typename charT, class traits>
::std::basic_ostream<charT,traits>& operator << (
               ::std::basic_ostream<charT,traits> & os,
               quaternion<T> const & q)
{
   ::std::basic_ostringstream<charT,traits>  s;
   s.flags(os.flags());
   s.imbue(os.getloc());
   s.precision(os.precision());
   s << '(' << q.R_component_1() << ','
            << q.R_component_2() << ','
            << q.R_component_3() << ','
            << q.R_component_4() << ')';
   return os << s.str();
}