Подтвердить что ты не робот

С++ Member Reference базовый тип 'int' не является структурой или объединением

Я столкнулся с проблемой в своем коде на С++.

У меня есть союз StateValue:

union StateValue
{
    int intValue;
    std::string value;
};

и struct StateItem

struct StateItem
{
    LampState state;
    StateValue value;
};

У меня есть метод, который проходит через вектор типа StateItem

for(int i = 0; i < stateItems.size(); i++)
{
    StateItem &st = stateItems[i];
    switch (st.state)
    {
        case Effect:
            result += std::string(", \"effect\": ") + st.value.value;
            break;
        case Hue:
            result += std::string(", \"hue\": ") + st.value.intValue.str();
            break;
        case On:
            result += std::string(", \"on\": ") + std::string(st.value.value);
            break;
        default:
            break;
    }
}

В случае Hue я получаю следующую ошибку компилятора:

Member reference base type 'int' is not a structure or union

Я не могу понять проблему здесь. Может кто-нибудь из вас, пожалуйста, помогите мне?

4b9b3361

Ответ 1

Вы пытаетесь вызвать функцию-член на intValue, которая имеет тип int. int не является типом класса, поэтому не имеет функций-членов.

В С++ 11 или более поздней версии есть удобная функция std::to_string для преобразования int и других встроенных типов в std::string:

result += ", \"hue\": " + std::to_string(st.value.intValue);

Исторически вам нужно было бы обходиться со строковыми потоками:

{
    std::stringstream ss;
    ss << st.value.intValue;
    result += ", \"hue\": " + ss.str();
}

Ответ 2

Member reference base type 'int' is not a structure or union

int является примитивным типом, у него нет методов и свойств.

Вы вызываете str() для переменной-члена типа int и того, на что жалуется компилятор.

Целые числа не могут быть неявно преобразованы в строку, но вы можете использовать std::to_string() в С++ 11, lexical_cast из boost или старый медленный подход stringstream.

std::string to_string(int i) {
    std::stringstream ss;
    ss << i;
    return ss.str();
}

или

template <
    typename T
> std::string to_string_T(T val, const char *fmt ) {
    char buff[20]; // enough for int and int64
    int len = snprintf(buff, sizeof(buff), fmt, val);
    return std::string(buff, len);
}

static inline std::string to_string(int val) {
    return to_string_T(val, "%d");
}

И измените строку на:

result += std::string(", \"hue\": ") + to_string(st.value.intValue);

Ответ 3

Ваша intvalue не является объектом. Он не имеет функций-членов. Вы можете использовать sprintf() или itoa(), чтобы преобразовать его в строку.

Ответ 4

intValue является int, он не имеет методов.