C ++成员引用基类型'int'不是结构或联合

时间:2014-01-27 17:36:27

标签: c++

我遇到了我的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

我不明白这里的问题。 你能有人帮我吗?

4 个答案:

答案 0 :(得分:11)

您正尝试在intValue上调用成员函数,该函数的类型为intint不是类类型,因此没有成员函数。

在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)

intValueint,它没有方法。