次のコードは、XPSP3 の VC++ 8 で正しくコンパイルされますが、実行するとランタイム エラーが発生します。
私のヘッダーは次のようになります。
#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;
};
私の実装は次のようになります。
#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;
}
これは正常にコンパイルされ、例外が生成されます (ヘッダーで定義された logic_error 例外ではありません)。
ファンクターの代わりに関数を使用するように実装を変更すると、機能します。
int main()
{
std::deque<int> tests;
std::generate_n( std::back_inserter( tests ), 10, rand );
return 0;
}
ここでファンクターを使用することの何が問題になっていますか?