ссылка — C ++ лямбда-сегментация ошибка

Следующий код вызывает ошибку сегментации, и я не знаю почему:

    myTree<int> tree;
tree.insert(10); // not important

std::vector<int> v = tree.toVector(); // Segmentation fault

Это код myTree (сокращенный, не компилируемый, достаточно, чтобы понять, о чем он):

template<class T> struct node {
T key;
node *left;
node *right;
int count;

node(const T &k=T(), node *l=0, node *r=0) {
key = k;
left = l;
right = r;
count = 1;
}
};

template<class T> class myTree {
public:
myTree() {
root = 0;
}

void traverseInOrder(void (*visitFunc)(node<T>* n)) {
traverseInOrder(visitFunc, root);
}

std::vector<T> toVector() {
std::vector<T> v;
traverseInOrder([&](node<T>* n) {
v.insert(v.end(), n->count, n->key);
});
return v;
}
private:
void traverseInOrder(void (*visitFunc)(node<T> *n), node<T> *n) {
if (n == 0) {
return;
} else {
if (n->left != 0) {
traverseInOrder(visitFunc, n->left);
}

(*visitFunc)(n);

traverseInOrder(visitFunc, n->right);
}
}

node<T> *root;
};

Ошибка сегментации происходит в этой строке:

v.insert(v.end(), n->count, n->key);

Окно переменных NetBeans говорит, что v — это OUT_OF_SCOPE.

Вопрос: правильно ли я использую лямбду?

Примечание: я использую g ++ (GCC) 4.7.2 (Cygwin).

2

Решение

Как упомянуто @Arkadiy в комментариях, лямбда с состоянием не распадается на указатель функции. Это исправить, чтобы написать свой traverseInOrder как шаблон, который принимает вызываемый объект

template<class Func>
void traverseInOrder(Func visitFunc)) {
traverseInOrder(visitFunc, root);
}

Кроме того, вы могли бы быть более безопасным для типов и дать ему подпись, которая принимает std::function это возвращает void и берет node<T>*

void traverseInOrder(std::function<void(node<T>*)> visitFunc)) {
traverseInOrder(visitFunc, root);
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector