为什么相同的语句不适用于 C++ 中的 Class 成员?

Why the same statement doesn't work for Class member in C++?

我是 C++ 的新手,下面是我的程序。它定义了一个嵌套向量。

#include <vector>

using namespace std;

int main(int argc, char *argv[]) {
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;
}

当我将相同的向量定义为class成员时,它报告语法错误:

#include <vector>

using namespace std;

class Test {
public:
    vector<vector<int>> grid(10, vector<int>(10, 10000));
};

int main(int argc, char *argv[]) {
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;
}

如何定义 vector<vector<int>> 类型的 class 成员并用 10 vector<int>(10, 10000) 初始化它?我试图在构造函数中声明变量并初始化它,但编译器报告 C:\my_projects\cpp1\main.cpp(8): error C2064: term does not evaluate to a function taking 2 arguments.

#include <vector>

using namespace std;

class Test {
public:
    Test() {
        grid(10, vector<int>(10, 10000));
    }

public:
    vector<vector<int>> grid;
};

int main(int argc, char *argv[]) {
    vector<vector<int>> grid(10, vector<int>(10, 10000));
    return 0;
}

你可以为 default member initializer (C++11 起)使用花括号初始化器或等号初始化器,它不支持圆括号初始化器;正如错误消息所说,它试图被解释为函数。

例如

class Test {
public:
    vector<vector<int>> grid{10, vector<int>(10, 10000)};
};

class Test {
public:
    vector<vector<int>> grid = vector<vector<int>>(10, vector<int>(10, 10000));
};

您的构造函数初始值设定项错误。它应该是(“:”之后的初始化程序)。 示例 (Live):

class Test {
public:
    Test() : grid(10, vector<int>(10, 10000))
    {
         // grid(10, vector<int>(10, 10000)); error: this is not initializer
         // grid = vector<vector<int>>(10, vector<int>(10, 10000)) - this is ok
    }

public:
    vector<vector<int>> grid;
};

并且对于 in-class 成员初始化,您可以使用花括号 '{' 或 '=' 来避免大多数 vexing parse problem (Live):

class Test {
public:
    vector<vector<int>> grid{10, vector<int>(10, 10000)};
};