Ошибки с xutility (‹chrono› ‹random› стандартные библиотеки C ++)

У меня возникла проблема с написанием простого генератора случайных чисел с использованием стандарта и в Microsoft Visual Studio 2013. Когда я пытаюсь скомпилировать, он выдает кучу ошибок, связанных с файлом xutility. У меня была куча похожих ошибок, когда я пытался использовать библиотеки BOOST для выполнения того же самого, так что это МОЖЕТ быть проблемой с MSVC.

#include <iostream>
#include <chrono>
#include <random>

using std::cout;
using std::endl;

auto seed = std::chrono::high_resolution_clock::now();

int main()
{
    std::uniform_int_distribution<> randNum(1, 6);

    cout << randNum(seed) << endl;

    return 0;
}

Вот ошибки, которые он выдает:

Ошибка 1 ошибка C2039: 'result_type': не является членом 'std :: chrono :: time_point' e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3256

Ошибка 2, ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором '_Ty1' e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3256

Ошибка 3 ошибка C4430: отсутствует спецификатор типа - предполагается int. Примечание: C ++ не поддерживает default-int e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3256

Ошибка 4 ошибка C2065: '_Ty1': необъявленный идентификатор e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3258

Ошибка 5, ошибка C2070: 'unknown-type': недопустимый размер операнда e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3258

Ошибка 6 ошибка C2065: '_Ty1': необъявленный идентификатор e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3259

Ошибка 7, ошибка C2923: 'std :: _ If': '_Ty1' не является допустимым аргументом типа шаблона для параметра '_Ty2' e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3259

Ошибка 8, ошибка C2955: 'std :: _ If': для использования шаблона класса требуется список аргументов шаблона e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 3259

Вот фрагмент кода из xutility, который, похоже, вызывает проблемы:

    // TEMPLATE CLASS _Rng_from_urng
template<class _Diff, class _Urng>
    class _Rng_from_urng
    {   // wrap a URNG as an RNG
public:
    typedef typename make_unsigned<_Diff>::type _Ty0;
    typedef typename _Urng::result_type _Ty1;

    typedef typename _If<sizeof (_Ty1) < sizeof (_Ty0),
        _Ty0, _Ty1>::type _Udiff;

После этого момента у класса есть НАМНОГО больше кода, но ошибки происходят в последних двух строках.

Между прочим, я потратил несколько часов, выполняя различные запросы, чтобы попытаться найти ответ, прежде чем опубликовать здесь, без каких-либо полезных результатов, хотя это могло легко быть недостатком с моей стороны.

Спасибо!

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

Измененный код:

    std::default_random_engine engine(seed);

    cout << randNum(engine) << endl;

Ошибка:

Ошибка 1 ошибка C2039: 'generate': не является членом 'std :: chrono :: time_point' e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ random 1618


person Llurendt    schedule 20.06.2015    source источник


Ответы (1)


cout << randNum(seed) << endl;

Вот как вы используете дистрибутив. Вам необходимо создать локальный движок, который вы инициализируете с помощью начального числа, а затем передадите движок оператору вызова распределения.

std::default_random_engine engine(seed);
cout << randNum(engine) << endl;

См. Пример на cppreference для более подробного примера:

http://en.cppreference.com/w/cpp/numeric/random

person Sebastian Redl    schedule 20.06.2015
comment
Спасибо! Это разрешило эти ошибки и создало новую: Ошибка 1, ошибка C2039: 'generate': не является членом 'std :: chrono :: time_point ‹std :: chrono :: system_clock, std :: chrono :: system_clock :: продолжительность ›'e: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ random 1618 - person Llurendt; 20.06.2015
comment
Мне показалось интересным, что все ошибки, казалось, не помогли решить настоящую проблему. : / - person Llurendt; 20.06.2015
comment
Вот почему для C ++ запланированы концепции: чтобы такие ошибки можно было диагностировать на месте вызова. - person Sebastian Redl; 30.06.2015