Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Проблема в том, что вы вызываете operator<<
для типов, которые не перегружают тот оператор, который вы затем вызываете внутри своей функции sharedLog
.
Для записи экземпляра типа T
в std::ostream
таким образом, вам необходимо перегрузить operator<<
.
Оператор должен быть реализован вне типа T
и иметь следующую подпись:
std::ostream& operator<< (std::ostream &out, const T& arg);
Если ему требуется доступ к закрытым и защищенным членам T
, его также следует объявить как друг:
friend std::ostream& operator<< (std::ostream &out, const T& arg);
Он должен вернуть ссылку out
, которую он получает, в качестве первых аргументов, чтобы вызовы можно было объединить в цепочку:
str << a << b << c;
Более подробную информацию можно найти здесь: [ 1112] https://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/
Оператор C2593 < < является неоднозначным
blockquote>У вас есть 2 или более реализаций, которые оба являются кандидатами, и компилятор не знает, какую из них выбрать. Сообщение об ошибке содержит дополнительные сведения, которые указывают на кандидатов, чтобы вы могли увидеть, какие типы конфликтов. Подробнее здесь: ошибка C2593: 'оператор < <' является неоднозначным
C2679 бинарный < < не найден оператор, который принимает правый операнд типа T (или нет приемлемого преобразования)
blockquote>Вы вызываете
operator<<
для типа, который не перегружает его, как описано в начало моего ответа.