uwzględniając klasę tak:Dlaczego nie można użyć metody prywatnej w lambda?
class A {
public:
bool hasGrandChild() const;
private:
bool hasChild() const;
vector<A> children_;
};
Dlaczego nie jest możliwe użycie prywatną metodę hasChild()
w wyrażeniu lambda określonym w metodzie hasGrandChild()
jak to?
bool A::hasGrandChild() const {
return any_of(children_.begin(), children_.end(), [](A const &a) {
return a.hasChild();
});
}
Compiler wystawia błąd, że metoda hasChild()
jest prywatny w kontekście. Czy istnieje jakieś obejście?
Edytuj: Wygląda na to, że kod, który napisałem, działa oryginalnie. Myślałem, że jest to równoważne, ale kod, który does not work on GCC więcej tak:
#include <vector>
#include <algorithm>
class Foo;
class BaseA {
protected:
bool hasChild() const { return !children_.empty(); }
std::vector<Foo> children_;
};
class BaseB {
protected:
bool hasChild() const { return false; }
};
class Foo : public BaseA, public BaseB {
public:
bool hasGrandChild() const {
return std::any_of(children_.begin(), children_.end(), [](Foo const &foo) {
return foo.BaseA::hasChild();
});
}
};
int main()
{
Foo foo;
foo.hasGrandChild();
return 0;
}
Wydaje się, że istnieje problem z pełni kwalifikowanych nazw jako this does not work, ale this works.
Rodzaj zamknięcia nie ma związku z klasy 'A', tak naturalnie, że nie ma dostępu do' członków niepublicznych A' użytkownika. Nie może też nigdy, ponieważ nazwa jego rodzaju jest niepoznawalna, więc nie można jej nawet nazwać "przyjacielem". –
Czy to tylko ja lub działa to na gcc? http://ideone.com/333qw – pmr
@pmr: Tak, wydaje się działać w starszych wersjach GCC, ale nie działa w nowszych. –