Предполагая, что мы говорим о перегрузке operator <<
для всех классов, полученных из std::ostream
для обработки класса Matrix
(а не для перегрузки <<
для класса Matrix
), имеет смысл объявить функция перегрузки вне пространства имен Math в заголовке.
Используйте функцию friend только в том случае, если функциональность не может быть достигнута через общедоступные интерфейсы.
Matrix.h
namespace Math {
class Matrix {
//...
};
}
std::ostream& operator<<(std::ostream&, const Math::Matrix&);
Обратите внимание, что перегрузка оператора объявляется вне пространства имен.
Matrix.cpp
using namespace Math;
using namespace std;
ostream& operator<< (ostream& os, const Matrix& obj) {
os << obj.getXYZ() << obj.getABC() << '\n';
return os;
}
С другой стороны, если ваша функция перегрузки делает нужно сделать другом, т. е. нуждается в доступе к частным и защищенным членам.
Math.h
namespace Math {
class Matrix {
public:
friend std::ostream& operator<<(std::ostream&, const Matrix&);
};
}
Вам нужно приложить определение функции блоком пространства имен, а не просто using namespace Math;
.
Matrix.cpp
using namespace Math;
using namespace std;
namespace Math {
ostream& operator<<(ostream& os, const Matrix& obj) {
os << obj.XYZ << obj.ABC << '\n';
return os;
}
}
Вы хотите что-то подобное:
select *
from . . . cross apply
( values (case when . . .
then . . .
else . . .
end)
) tt (test)
where tt.test = 'X'
Вы можете заключить запрос в подзапрос и поместить предложения SELECT и WHERE за его пределы:
SELECT a, b, c, test
FROM (
SELECT a, b, c, CASE
WHEN ...
WHEN ...
END AS test
FROM ...
) AS sq
WHERE sq.test = 'something'
В идеале вам следует избегать case в предложении where.