Странная ошибка «Ни один экземпляр конструктора не соответствует списку аргументов» (решено) - PullRequest
0 голосов
/ 20 апреля 2020

Edit: я скопировал базовый шаблон для класса statisticscompiler из другого решения, и кажется, что я каким-то образом закончил редактирование исходного, включая новый (который еще не редактировался), что привело к ошибки. Так что предостережение против копирования кода вставки в другой файл с тем же именем.

Я просто опубликую файлы заголовков, потому что я думаю, что это здесь важно, дайте мне знать, если иначе, и я могу выложить cpp. У меня есть один базовый класс, который собирает статистику из процесса, с двумя производными классами, а затем класс, который позволяет мне использовать несколько классов статистики одновременно

Statistics.h

#pragma once
#define STATISTIC_H
#include <vector>
#include "Arrays.h"

class Statistics
{
public:
    Statistics() {}
    virtual void DumpOnePath(MJArray results) = 0;
    virtual std::vector<std::vector<double>> GetResultsSoFar() const = 0;
    virtual Statistics* clone() const = 0;
    virtual ~Statistics() {}
private:
};

class StatisticsMean : public Statistics
{
public:
    StatisticsMean();
    virtual void DumpOnePath(MJArray results) ;
    virtual std::vector<std::vector<double>> GetResultsSoFar() const ;
    virtual Statistics* clone() const;
private:
    MJArray RunningSums;
    unsigned long PathsDone;
};

class StatisticsQuantiles : public Statistics
{
public:
    StatisticsQuantiles(double p_lower_, double p_upper_);
    virtual void DumpOnePath(MJArray results);
    virtual std::vector<std::vector<double>> GetResultsSoFar() const;
    virtual Statistics* clone() const;
private:
    std::vector<MJArray> RunningResults;
    unsigned long PathsDone;
    double p_lower;
    double p_upper;
};


StatisticsCompiler.h

#pragma once
#define STATISTICS_COMPILER_H
#include "statistics.h"
#include "wrapper.h"
class StatisticsCompiler : public Statistics
{
public:
    StatisticsCompiler(const std::vector <Wrapper<Statistics>>& Inner_);
    virtual Statistics* clone() const;
    virtual void DumpOnePath(MJArray results);
    virtual std::vector<std::vector<double>> GetResultsSoFar() const;
private:
    std::vector <Wrapper<Statistics>> Inner;
};

И в моем основном классе я пытаюсь сделать это:

StatisticsMean meanGatherer;
StatisticsQuantiles quantileGatherer(p_lower, p_upper);
vector<Wrapper<Statistics>> gathererArray{ meanGatherer, quantileGatherer};
StatisticsCompiler meanAndQuantileGatherer(gathererArray);

, которая выдает ошибку без последней строки, жалуясь, что «Ни один экземпляр конструктора не соответствует списку аргументов Типы аргументов:

(std::vector<Wrapper<Statistics>, std::allocator<Wrapper<Statistics>>>)."

Но разве это не то, что я определил для конструктора для принятия? По крайней мере, в первой части, я не знаю, что

std::allocator<Wrapper<Statistics>>

означает.

Wrapper.h в случае необходимости. Он обрабатывает память

#pragma once
#define WRAPPER_H
template< class T>
class Wrapper
{
public:
    Wrapper()
    {
        DataPtr = 0;
    }
    Wrapper(const T& inner)
    {
        DataPtr = inner.clone();
    }
    ~Wrapper()
    {
        if (DataPtr != 0)
            delete DataPtr;
    }
    Wrapper(const Wrapper<T>& original)
    {
        if (original.DataPtr != 0)
            DataPtr = original.DataPtr->clone();
        else
            DataPtr = 0;
    }
    Wrapper& operator=(const Wrapper<T>& original)
    {
        if (this != &original)
        {
            if (DataPtr != 0) {
                delete DataPtr;
            }
            DataPtr = (original.DataPtr != 0) ? original.DataPtr->clone() : 0;
        }
        return *this;
    }
    T& operator*()
    {
        return *DataPtr;
    }
    const T& operator*() const
    {
        return *DataPtr;
    }
    const T* const operator->() const
    {
        return DataPtr;
    }
    T* operator->()
    {
        return DataPtr;
    }
private:
    T* DataPtr;
};

...