Создание вектора векторов для использования в классе и построения графика с использованием CERNROOT

Я новичок в программировании и хочу создать класс или заголовок (я, честно говоря, не уверен, что это такое, как я уже сказал, начинающий физик, пытаюсь использовать свое свободное время, но я предполагаю, что это файл заголовка, рассматриваемый как в нем будет определение объекта, который скоро будет упомянут). У меня проблемы с созданием вектора векторов. Я думал, что это было сделано примерно так:

    #include <array>
    #include <vector>


    constexpr int MaxIterations = 101;
    constexpr double aprox_PI = 3.141592653589793238463;

    using PiArray = std::array<double, MaxIterations>;
    using PiMatrix = std::array<PiArray, MaxIterations>;
    using PiVector = std::vector<std::vector<double>> ; //here lies the problem, the ones above work fine.

    class MonteCarloPiCalculator{
        //some stuff goes in here, like function declarations. The definitions are in another file
    }

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

auto* gr4 = new TGraph(calc.VectPot.data(), calc.relDiff.data());

Из файла ROOT TGraph я нашел это:

TGraph(const TVectorF &vx, const TVectorF &vy); 
TGraph(const TVectorD &vx, const TVectorD &vy);

Это означало бы, что я могу использовать векторы со значениями float и double в них. Еще до компиляции я получаю это сообщение в Visual Studio:

ни один экземпляр конструктора не соответствует типам аргументов списка аргументов: (const std :: vector ‹double, std :: allocator ‹double>> *, const std :: vector‹ double, std :: allocator ‹double>> *)

Как мне решить эту проблему? Буду признателен за любую помощь, которую я могу получить. Спасибо, что уделили время.


person Bogfoot    schedule 16.06.2020    source источник
comment
Первый комментарий: обычно в C ++ мы по возможности избегаем сырых указателей в пользу умных указателей: shared_ptr, weak_ptr и unique_ptr.   -  person Adrian Maire    schedule 16.06.2020
comment
Кроме того, чтобы иметь возможность устранить вашу проблему, было бы хорошо иметь stackoverflow.com/help/minimal-reproducible- пример   -  person Adrian Maire    schedule 16.06.2020
comment
Ошибка просто указывает на то, что вы пытаетесь создать объект с неверным типом аргументов.   -  person Adrian Maire    schedule 16.06.2020


Ответы (1)


TGraph (const TVectorD & vx, const TVectorD & vy);

Это ссылки на TVectorD, а не на исходные указатели.

person Adrian Maire    schedule 16.06.2020
comment
Да, об этом я и подумал, прочитав ошибку. Может быть, у вас есть идея, как изменить вектор определения векторов, чтобы он работал в этом случае? Также спасибо за подсказку о воспроизводимых примерах, попробую что-нибудь сделать! - person Bogfoot; 16.06.2020
comment
Я исправил проблему. Я просто использовал свой формат массива вместо векторного. Спасибо вам за помощь. - person Bogfoot; 17.06.2020
comment
В основном вам нужно сопоставить свои аргументы с конструктором и тем, что определено в конструкторе. Если TVectorD является std :: array, вам нужно либо использовать std :: array, либо добавить конструктор для std :: vector. Трудно сказать больше, не просматривая свой код. - person Adrian Maire; 17.06.2020
comment
Еще раз спасибо! Я использовал массив вместо вектора после того, как вчера увидел ваш комментарий. Теперь все работает так, как задумано. - person Bogfoot; 17.06.2020