调用list.size()方法会产生错误“表达式必须具有类类型”

时间:2019-08-30 22:30:37

标签: c++

我正在尝试使用for (int i = 0; i < options.size(); i++)遍历列表,其中options是我需要遍历的列表。我得到的错误是

expression must have class type.

我已经尝试过(int) options.size() 在for循环中以及for循环之前的int length = options.size()中,均无济于事。我究竟做错了什么???这是全部功能;列表options[]被传递给具有三个项目的函数。

    int getChoice(string options[], int low, int high) {
        // Method variables:
        bool legal;     // True if input is valid, false otherwise
        string valid;   // List of valid inputs
        string entry;   // Temporary holder for user input
        int input;      // Return variable for user entry

        // Assign values to variables:
        legal = false;
        valid = "0123456789";

        // Print options, get/test user input:
        while (cont) {
            int length = options.size();  // didn't work
            (int) options.size() >> length; // didn't work
            for (int i = 0; i < options.size; i++) { // didn't work
                cout << i << ". " << options[i] << endl;
            }
        }
    }

我看不出任何可能导致错误的原因,所以我什至不知道从哪里开始修复它:(

1 个答案:

答案 0 :(得分:4)

声明

string options[]

等同于

string* options

在函数参数中。

鉴于options.size()是错误的,因为指针没有任何成员函数。

我可以想到以下克服这种障碍的方法。

选项1

将数组的大小作为参数传递给函数。

int getChoice(string options[], size_t size, int low, int high) {

并在函数中使用它。

选项2

使用std::vector<std::string>代替指针。

int getChoice(std::vector<std::string> const& options, int low, int high) {

您可以使用range-options循环轻松地遍历for的内容。如果需要向量的大小,则可以使用options.size()

选项3

如果在编译时知道数组的大小,则也可以使用std::array<std::string, SIZE>

const int SIZE = 10; // Just an example.

...

int getChoice(std::array<std::string, SIZE> const& options, int low, int high) {

std::vector一样,您可以使用range-options循环遍历for的内容。如果需要大小,也可以使用SiZE的形式。