为啥相同的语句不适用于 C++ 中的类成员?
Posted
技术标签:
【中文标题】为啥相同的语句不适用于 C++ 中的类成员?【英文标题】:Why the same statement doesn't work for Class member in C++?为什么相同的语句不适用于 C++ 中的类成员? 【发布时间】:2021-01-05 09:19:16 【问题描述】:我对 C++ 很陌生,下面是我的程序。它定义了一个嵌套向量。
#include <vector>
using namespace std;
int main(int argc, char *argv[])
vector<vector<int>> grid(10, vector<int>(10, 10000));
return 0;
当我定义同一个向量作为类成员时,报语法错误:
#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>>
类型的类成员并将其初始化为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;
【问题讨论】:
I'm very new to C++
这就是为什么你应该使用good C++ book。 C++ 很复杂,尝试从各种互联网资源和直觉中学习它不会让你走得太远、很快。
【参考方案1】:
default member initializer(C++11 起)可以使用花括号初始化器或等号初始化器,它们不支持括号初始化器;正如错误消息所说,它试图被解释为函数。
例如
class Test
public:
vector<vector<int>> grid10, vector<int>(10, 10000);
;
或
class Test
public:
vector<vector<int>> grid = vector<vector<int>>(10, vector<int>(10, 10000));
;
【讨论】:
感谢您的快速回复!我还有一个问题。为什么vector<long> numbers20, 99L;
表示用两个初始值初始化一个向量,而vector<vector<int>> grid10, vector<int>(10, 10000);
表示10 vector<int>(10, 10000)
?
@Justalearner 因为std::vector
有一个constructor 采用std::initializer_list
(链接页面中的#10),在使用花括号初始化器初始化时是首选。 10, vector<int>(10, 10000)
无法构造有效的std::initializer_list
,那么vector<vector<int>> grid10, vector<int>(10, 10000);
将使用#3 构造函数。
再次感谢您的澄清!【参考方案2】:
您的构造函数初始化程序错误。它应该是(':' 之后的初始化程序)。 示例(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;
;
对于类内成员初始化,您可以使用花括号“”或“=”来避免大多数 vexing parse problem (Live):
class Test
public:
vector<vector<int>> grid10, vector<int>(10, 10000);
;
【讨论】:
以上是关于为啥相同的语句不适用于 C++ 中的类成员?的主要内容,如果未能解决你的问题,请参考以下文章
c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?