【问题标题】:Template argument for std::vector initializationstd::vector 初始化的模板参数
【发布时间】:2020-12-26 15:59:22
【问题描述】:

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

#include <cstddef>
#include <vector>

template <std::size_t N>
struct Matrix {
    std::vector<std::vector<int>> data_{N, std::vector<int>(N)};
};

为什么不能用圆括号初始化data_

std::vector<std::vector<int>> data_(N, std::vector<int>(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>

【问题讨论】:

  • 因为有圆括号,这看起来像一个函数声明。这就是为什么要引入大括号的原因。
  • Afaik 这仅适用于类范围。如果您尝试在函数范围内执行此操作,它应该可以工作。

标签: c++ c++11 templates initialization


【解决方案1】:

Default member initializer (C++11 起) 不支持括号初始化器,仅支持大括号初始化器和等号初始化器。

通过一个默认成员初始化器,它是一个大括号或等于成员声明中包含的initializer,并且在构造函数的成员初始化器列表中省略该成员时使用。

除了你展示的那个,你还可以

template <std::size_t N>
struct Matrix {
    std::vector<std::vector<int>> data_ = std::vector<std::vector<int>>(N, std::vector<int>(N));
};

【讨论】:

    【解决方案2】:

    () 与最麻烦的解析的常规声明有问题。

    为避免这种可能的问题,在类成员初始化中不允许使用该语法。

    【讨论】:

      猜你喜欢
      • 2013-06-06
      • 2022-01-16
      • 2013-07-13
      • 2012-06-09
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      相关资源
      最近更新 更多