C++ std::vector初始化的模板参数

C++ std::vector初始化的模板参数,c++,c++11,templates,initialization,C++,C++11,Templates,Initialization,有一个名为Matrix的结构,带有一个模板参数N和数据字段: #包括 #包括 模板 结构矩阵{ std::向量数据{N,std::向量(N)}; }; 为什么不能使用圆括号初始化数据 std::vector数据(N,std::vector(N)); 以下是错误: <source>:6:41: error: unknown type name 'N' std::vector<std::vector<int>> data_(N, std::vector

有一个名为
Matrix
的结构,带有一个模板参数
N
数据
字段:

#包括
#包括
模板
结构矩阵{
std::向量数据{N,std::向量(N)};
};
为什么不能使用圆括号初始化
数据

std::vector数据(N,std::vector(N));
以下是错误:

<source>:6:41: error: unknown type name 'N'
    std::vector<std::vector<int>> data_(N, std::vector<int>(N));
                                        ^
<source>:6:61: error: declaration of 'N' shadows template parameter
    std::vector<std::vector<int>> data_(N, std::vector<int>(N));
                                                            ^
<source>:4:23: note: template parameter is declared here
template <std::size_t N>
:6:41:错误:未知类型名称“N”
std::vector data_un,std::vector(N));
^
:6:61:错误:“N”阴影模板参数的声明
std::vector data_un,std::vector(N));
^
:4:23:注意:此处声明了模板参数
模板
(因为C++11)不支持括号初始值设定项,只支持括号初始值设定项和等号初始值设定项

通过默认成员初始值设定项,该初始值设定项是成员声明中包含的大括号或相等项,如果从构造函数的成员初始值设定项列表中省略该成员,则使用该初始值设定项

除了你展示的带支架的,你还可以

template <std::size_t N>
struct Matrix {
    std::vector<std::vector<int>> data_ = std::vector<std::vector<int>>(N, std::vector<int>(N));
};
模板
结构矩阵{
std::vector data_uz=std::vector(N,std::vector(N));
};
()
对于最麻烦的语法分析来说,常规声明有问题


为了避免这个可能的问题,类内成员初始化不允许这种语法。

因为圆括号看起来像函数声明。这就是为什么会引入花括号的原因。好吧,这只适用于类范围。如果您尝试在函数的范围内执行此操作,它应该可以工作。