Tener una clase como esta:¿Por qué no es posible usar el método privado en una lambda?
class A {
public:
bool hasGrandChild() const;
private:
bool hasChild() const;
vector<A> children_;
};
Por qué no es posible utilizar un método privado hasChild()
en una expresión lambda se define en el método hasGrandChild()
así?
bool A::hasGrandChild() const {
return any_of(children_.begin(), children_.end(), [](A const &a) {
return a.hasChild();
});
}
compilador emite un error que el método hasChild()
es privado dentro del contexto. ¿Hay algún trabajo alrededor?
Editar: Parece que el código como lo publiqué originalmente funciona. Pensé que es equivalente, pero el código que does not work on GCC es de la misma familia:
#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;
}
Parece que hay un problema con los nombres completos como this does not work, pero this works.
El tipo de cierre no tiene relación con su clase 'A', por lo que, naturalmente, no se puede acceder' miembros no públicos de a'. Tampoco puede, dado que su nombre de tipo es incognoscible, por lo que ni siquiera puede convertirlo en un "amigo". –
¿Soy yo o funciona en gcc? http://ideone.com/333qw – pmr
@pmr: Sí, parece funcionar en GCC anterior, pero no funciona en uno más nuevo. –