【问题标题】:initialize vector of pointers (automatically)初始化指针向量(自动)
【发布时间】:2012-06-13 04:49:59
【问题描述】:

尝试通过std::vector 构造函数初始化指向NULL 的指针向量时遇到编译错误。我简化了说明以使其简单:

vector<int*> v (100,NULL)

我猜这与const T&amp; value= T()(构造函数的参数)和NULL值之间的不兼容有关,但我希望能得到进一步的解释。

谢谢

【问题讨论】:

  • “执行错误”?错误是什么?您是否在调试器中运行它以确认是这条线失败了?
  • 不,我没有使用调试器(我是个新手)。另外,这不是执行而是编译错误,我错了。给你: ArbreN.hpp:55:3: 警告:将 NULL 传递给 'std::vector<_tp _alloc>::vector(_InputIterator, _InputIterator, const allocator_type&) [with _InputIterator = int, _Tp = ArbreNari::node_arbreNari*, _Alloc = std::allocator::node_arbreNari*>, std::vector<_tp _alloc>::allocator_type = std::allocator ::node_arbreNari*>]' [-Wconversion-null]
  • 顺便说一下,如果你使用单参数构造函数(vector&lt;int *&gt; v(100);,它们会自动初始化为NULL
  • 我无法在 ideone (link) 上重现警告。
  • 当询问一段特定的无法编译的代码时,请确保包含编译器错误消息。虽然有时很复杂,但它们通常包含有助于确定问题原因的重要信息。

标签: c++ pointers null stdvector


【解决方案1】:

NULL 可能被定义为0,所以你最终会得到

vector<int*> v(100,0);

它试图构建ints 的向量,而不是int*s 的向量。

只需跳过 NULL,因为这是指针的默认值,或者将其转换为正确的指针类型 (int*)NULL

【讨论】:

  • 我猜它宁愿尝试使用构造函数重载,采用两个输入迭代器(通过将输入迭代器类型解析为int)。它不只是神奇地尝试创建一个ints 的向量,它仍然是一个被调用的std::vector&lt;int*&gt; 构造函数。
  • 嗯,这就是我的看法。 :-) 主要问题是 NULL 是 0,这使得构造函数调用看起来像 vector(int,int)。这vector&lt;int&gt;工作。
【解决方案2】:

如果你有相关的 C++11 支持,你可以使用nullptr:

std::vector<int*> v(100, nullptr);

但是,在您的特定情况下,无需指定默认值,因此以下内容就足够了:

std::vector<int*> v(100);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2012-02-23
    相关资源
    最近更新 更多