Моя локальная функция была отмечена как const
, и я забыл включить ее в код ниже. Кроме того, эта отметка const
также стала причиной того, что я увидел ошибку ниже, и мне потребовалось слишком много времени, чтобы осознать это.
Я просмотрел часовое видео от {@Howard Hinnant} и не увидел ничего, что указывало бы на то, что мне нужно.
#include <iostream>
#include <chrono>
#include <cstdint>
namespace chrono = std::chrono;
namespace chrono_lit = std::chrono_literals;
using namespace chrono_lit;
class TrackTimeElapsed {
public:
TrackTimeElapsed(uint64_t interval):
m_timestamp(chrono::steady_clock::now()), m_interval(interval) {}
~TrackTimeElapsed() {}
void trackTime() const { // Edit @14:15 << Just realized my function was const locally, and that was causing issues.
chrono::time_point<chrono::steady_clock> now = chrono::steady_clock::now();
auto diff = chrono::duration_cast<std::chrono::seconds>(now - m_timestamp);
if (diff.count() > m_interval) {
std::cout << "Time elapsed" << std::endl;
// Update timestamp to help track when next print out needs to occur.
m_timestamp = now; // const related error was being experienced here, which makes sense due to my function being const.
}
}
private:
chrono::time_point<chrono::steady_clock> m_timestamp;
uint64_t m_interval;
};
Вот ошибка, которую я получаю при попытке скомпилировать:
Class File: error: passing 'const std::chrono::_V2::system_clock::time_point' {aka 'const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >'} as 'this' argument discards qualifiers [-fpermissive]
105 | timestamp = now;
trackTime
может быть отмечено const
Почему m_interval
не указана продолжительность с временным разрешением? То, как вы это написали, предполагает очень конкретное временное разрешение для steady_clock
, которое зависит от платформы.
«Проблема здесь связана с тем, что оператор присваивания не определен». Какую именно ошибку вы получаете?
@Г.М. Я использую пример кода, чтобы изложить задачу кратко. Это отражает то, что у меня есть в моем проекте. Если вам нужен некоторый контекст, я пишу журнал файлов на основе времени, который закрывает и открывает новый файл по истечении определенного периода времени с момента открытия текущего файла.
«// Issue here
» В чем проблема?? Кажется, ваш код компилируется нормально для всех, кто его пробовал. Это не минимально воспроизводимый пример , если только вы не объясните, чего вы ожидали и что произошло на самом деле.
Что происходит, когда вы пытаетесь выполнить задание m_interval
внутри trackTime()
? Какое (если есть) сообщение об ошибке появляется в результате? Будет ли это связано с симптомами, указанными в вашем вопросе?
Я понял проблему. Моя функция была объявлена как const
, и она мне просто понравилась. Приносим извинения!
@chris Если вы сделаете свой комментарий ответом, я поддержу его. Я также надеюсь, что это будет отмечено правильно.
Я отмечу правильно. Но он также должен указать, что это было до публикации обновления.
@HowardHinnant, спасибо за сигнал, я отвлекся. Избегая еще одного обращения к ОП, я с гордостью могу сказать, что теперь это «она» :)
В целом проблем с назначением time_point
(это просто завернутый номер) не возникает, но в обновленном сообщении trackTime
отмечен const
, поэтому изменение членов this
не разрешено.
void trackTime() const {
^^^^^ Remove this
По крайней мере, для меня имя функции предполагает, что она может изменить объект, поэтому отсутствие const
соответствует моим ожиданиям.
У вас есть и
TrackTimeElapse
, иTrackTimeElapsed
. Пожалуйста, предоставьте реальный код.