С++ 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
Я не могу понять проблему здесь.
Может кто-нибудь из вас, пожалуйста, помогите мне?
Ответы
Ответ 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
, он не имеет методов.