我遇到了我的C ++代码中的问题。
我有一个工会StateValue
:
union StateValue
{
int intValue;
std::string value;
};
和结构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
我不明白这里的问题。 你能有人帮我吗?
答案 0 :(得分:11)
您正尝试在intValue
上调用成员函数,该函数的类型为int
。 int
不是类类型,因此没有成员函数。
在C ++ 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();
}
答案 1 :(得分:2)
Member reference base type 'int' is not a structure or union
int
是一种原始类型,它没有方法也没有属性。
您正在str()
类型的成员变量上调用int
,而这正是编译器所抱怨的。
整数不能隐式转换为字符串,但您可以在C ++ 11中使用std::to_string()
,在lexical_cast
中使用boost
,或使用{{1}的旧 - 慢方法}。
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[256]; // far more than enough for int
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");
}
答案 2 :(得分:0)
你的intvalue不是对象。它没有成员功能。您可以使用sprintf()或itoa()将其转换为字符串。
答案 3 :(得分:0)
intValue
是int
,它没有方法。