Экземпляр класса "по умолчанию" в качестве поля этого класса, C++

У меня есть класс сообщения, которое хранится в очереди сообщений для передачи их между потоками. Вот как он выглядит:

class Message
{
public:
    Message()
        : Message(0, std::string(), 0)
    {

    }

    Message(std::time_t time, std::string body, int count = 4)
        : timestamp(time), cmd(body), count(count)
    {

    }

    std::string body()
    {
        return cmd;
    }

    int getCount()
    {
        return count;
    }

    void decrementCount()
    {
        --count;
    }
    
public:
    static Message DEFAULT = Message();

private:
    std::string cmd;
    std::time_t timestamp;
    int count;
}; 

И мне надо иметь "сообщение по умолчанию" - пустое сообщение, которое я буду возвращать из очереди, когда в ней пусто:

Message& top(int timeout = 0)
        {
            std::unique_lock<std::mutex> lock(mutex);

            static Message DEFAULT = Message();

            if (timeout <= 0)
            {
                condition.wait(lock, [this] {
                    return !messages.empty();
                });
            }
            else
            {
                auto timeoutOccured = !condition.wait_for(lock, std::chrono::milliseconds(timeout), [this] {
                    return !messages.empty();
                });

                if (timeoutOccured)
                    return Message::DEFAULT;
            }
        }

Проблема в том, что при таком объявлении поля DEFAULT в классе Message компилятор жалуется на incomplete тип. Как исправить эту ошибку и решить мою задачу?


Ответы (1 шт):

Автор решения: Никита

А зачем оно вам внутри класса? Вынесите его после класса в тот же namespace с inline, будет работать.

→ Ссылка