簡體   English   中英

錯誤:不匹配的類型:<function> 和<lambda></lambda></function>

[英]error: mismatched types: <function> and <lambda>

我寫了一個簡單的 function 在迭代器上使用std::for_each時給了我一個索引。 function如下:

template<typename It, typename I = std::size_t>
void for_each_indexed(It begin,
                      It end,
                      void l(typename std::iterator_traits<It>::value_type, I),
                      I counter = 0) {
    std::for_each(begin, end,
        [&counter, &l](typename std::iterator_traits<It>::value_type value) {
            l(value, counter);
            counter++;
        });
};

我的問題是,當我將 lambda 傳遞給此 function 時,出現如下錯誤:

test.cpp:40:6: error: no matching function for call to ‘for_each_indexed(std::__cxx11::
basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, crossOutChar(
std::__cxx11::string&, char)::<lambda(char, size_t)>)’
     });
      ^
test.cpp:18:6: note: candidate: ‘template<class It, class I> void for_each_indexed(It, 
It, void (*)(typename std::iterator_traits<_Iter>::value_type, I), I)’
 void for_each_indexed(It begin,
      ^~~~~~~~~~~~~~~~
test.cpp:18:6: note:   template argument deduction/substitution failed:
test.cpp:40:6: note:   mismatched types ‘void (*)(typename std::iterator_traits<_Iter>:
:value_type, I)’ and ‘crossOutChar(std::__cxx11::string&, char)::<lambda(char, size_t)’
     });
      ^

以下編譯並運行:

void process(char c, size_t i) {}

void crossOutChar(std::string &s, char c) {
    for_each_indexed(s.begin(), s.end(), process);
}

但以下沒有:

void
crossOutChar(std::string &s, char c) {
    auto process = [c, &s](char c2, size_t i) {
      if (c == c2) {
        s[i] = '*';
      }
    };

    for_each_indexed(s.begin(), s.end(), process);
}

這里可能是什么錯誤? 提前致謝。

捕獲的 lambda 不能轉換為指向函數的指針。 您可以將您的 function 原型更改為類似

template<class F, typename It, typename I = std::size_t>
void for_each_indexed(It begin,
                      It end,
                      F &&l,
                      I counter = 0)

附帶說明一下,整數對象(此處為counter )更好地按值捕獲。

首先:您不能將 lambda 表達式轉換為 function 指針,因為它會捕獲。

要處理您引用的兩種情況,您必須使用std::function 但是,由於轉換為std::function ,即使您設置了默認參數,編譯器也將無法推斷I 然后,您有一些選擇:

顯式設置std::size_t

std::function<void(typename std::iterator_traits<It>::value_type, std::size_t)> l

或者為 function 創建另一個模板參數:

template<typename It, typename F, typename I = std::size_t>
void for_each_indexed(It begin,
                      It end,
                      F&& l,
                      I counter = 0)

暫無
暫無

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

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