Le code suivant compile correctement sous VC++ 8 sur XPSP3, mais son exécution provoque une erreur d'exécution.Manière correcte d'utiliser le foncteur personnalisé avec l'algorithme std :: generate_n()?
Mon tête ressemble à:
#include <stdexcept>
#include <iterator>
#include <list>
template<typename T>
class test_generator
{
public:
typedef T result_type;
//constructor
test_generator()
{
std::generate_n(std::back_inserter(tests), 100, rand);
value = tests.begin();
}
result_type operator()(void)
{
if(value == tests.end())
{
throw std::logic_error("");
}
return *value++;
}
private:
std::list<T> tests;
typename std::list<T>::iterator value;
};
Ma mise en œuvre ressemble:
#include <functional>
#include <algorithm>
#include <iostream>
#include <deque>
#include "test.h"
int main()
{
test_generator<double> test;
std::deque<double> tests;
std::generate_n(std::back_inserter(tests), 10, test);
return 0;
}
Cette compile bien, il génère une exception (pas d'exception logic_error définie dans l'en-tête).
Si je change la mise en œuvre d'utiliser une fonction au lieu d'un foncteur, il fonctionne:
int main()
{
std::deque<int> tests;
std::generate_n(std::back_inserter(tests), 10, rand);
return 0;
}
Quel est le problème avec l'aide d'un foncteur ici?
Déplacé l'initialisation de valeur dans la liste d'initialisation et implémenté un constructeur de copie, cela a résolu le problème. – paxos1977