簡體   English   中英

列表初始化器

[英]List initializer

我試圖聲明一個類型為std::initializer_list的迭代器,如本答案所述

但是我總是會收到這個錯誤:

error: 'iterator' is not a member of 'std::initializer_list<int>'

如何聲明類型為std::initializer_list的迭代器?

例如,以下代碼將不起作用。 另外,我使用的編譯器支持新的標准草案。

int findCommon(std::initializer_list<int> nums)
{
    std::initializer_list<int>::iterator it;
    for (it = nums.begin() ; it != nums.end() ; ++it)
    {
        std::cout << *it << std::endl;
    }
    return 1;
}

您需要添加

#include <initializer_list>

在這個例子中

#include <iostream>

還要確保您正在使用-std=c++0x切換到g ++。 而且您至少需要g ++ 4.4版。 從MacPorts使用編譯器時,編譯器稱為 g++-mp-4.5g++-mp-4.4 (錯誤的假設)。

我在GCC bugzilla上注意到了一些與initializer_list相關的最近已修復的錯誤,因此,我建議獲取最新版本的GCC 4.5.1。 因為使用此版本時,我可以毫無問題地編譯兩個示例。

您的編譯器的實現可能只是沒有這些typedef(例如,在GCC 4.4.1中, initializer_list不包含任何typedef,您可以自己檢查標頭)。

作為一種“解決方法”,請使用auto

int findCommon(std::initializer_list<int> nums)
{
    for (auto it = nums.begin() ; it != nums.end() ; ++it)
    {
        std::cout << *it << std::endl;
    }
    return 1;
}

或依靠initializer_list<T>::iterator作為const T*的同義詞。

您可以避免直接指定迭代器類型,這會導致代碼更簡潔:

void f(std::initializer_list<int> nums)
{
  for (auto x : nums) {
    std::cout << x << '\n';
  }
  // or:
  std::copy(begin(nums), end(nums), std::ostream_iterator(std::cout, "\n"));
}

GCC 4.6支持基於范圍的for循環。 (是否有非正式地將它們稱為foreach循環的問題?)

std :: begin和std :: end可能需要包含<iterator>,盡管可以保證聲明了多個標頭(24.6.5,N3092)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM