Przechwytywanie tego wskaźnika w opakowaniu lambda wokół funkcji rekurencyjnej
Mam szablon klasyWrap<T>
z rekurencyjną funkcją składowątest(int)
które chcę przekazać algorytmowi STL z lambda (std::accumulate
w poniższym kodzie).
Jeśli użyję domyślnej listy przechwytywania=
i wykonaj moją rekurencyjną funkcję meberastatic
, wszystko jest w porządku i uzyskaj wynik, którego chcę.
Jednakże, jeśli sprawię, że będzie to niestatyczna funkcja składowa, zarówno Visual C ++, jak i gcc 4.7.2 narzekają na unormowaniethis
-pointer, chyba że zakwalifikuję moje rekurencyjne wywołanie jakothis->test()
.
#include <algorithm>
#include <iostream>
#include <vector>
template<typename T>
struct Wrap
{
static int test1(int depth)
{
std::vector<int> v = { 0, 1, 2, 3 };
return depth == 0? 1 : std::accumulate(v.begin(), v.end(), int(0), [=](int sub, int const&) {
return sub + test1(depth - 1);
});
}
int test2(int depth)
{
std::vector<int> v = { 0, 1, 2, 3 };
return depth == 0? 1 : std::accumulate(v.begin(), v.end(), int(0), [=](int sub, int const&) {
return sub + /*this->*/test2(depth - 1);
});
}
};
int main()
{
std::cout << Wrap<int>::test1(0) << "\n"; // 1
std::cout << Wrap<int>::test1(1) << "\n"; // 4
std::cout << Wrap<int>::test1(2) << "\n"; // 16
Wrap<int> w;
std::cout << w.test2(0) << "\n"; // 1
std::cout << w.test2(1) << "\n"; // 4
std::cout << w.test2(2) << "\n"; // 16
}
Wyjście włączoneLiveWorkSpace:
source.cpp: In instantiation of 'int Wrap<T>::test2(int) [with T = int]':
source.cpp:32:26: required from here
source.cpp:19:74: error: missing initializer for member 'Wrap<T>::test2(int) [with T = int]::<lambda(int, const int&)>::__this' [-Werror=missing-field-initializers]
Odkomentowanie/*this->/*
kawałek, daje taki sam wynik jak dla funkcji członka statycznego.
Dlaczego muszę zakwalifikować moje wywołanie rekurencyjne za pomocąthis->
?