【问题标题】:Can you help me with oop?你能帮我用oop吗?
【发布时间】:2022-01-22 04:02:21
【问题描述】:

这是我的代码:

Extractor.hpp
template <class O, class D> class Extractor{
  public:
    Extractor(
        std::vector<O>& input_data,
        Filtro<O>& filtro,
        Mapeador<O, D>& mapeador
    ): _input_data(input_data), _filtro(filtro), _mapeador(mapeador) {}

    unsigned int getData(std::vector<D>& output) {
      unsigned total = 0;
      for (O& data: _input_data) {
        if (_filtro.dadoValido(data)) {
          output.push_back(_mapeador.transformaDado(data));
          total++;
        }
      }
      return total;
    }

  private:

    std::vector<O>& _input_data;

    Filtro<O>& _filtro;

    Mapeador<O, D>& _mapeador;
};
Extractor.cpp
template <class NUM_TYPE>
class Num2Sqrt: public Mapeador<NUM_TYPE, NUM_TYPE> {
...
  }
};

class FiltroNumPositivo: public Filtro<NUM_TYPE> {
  bool dadoValido(NUM_TYPE& d) const override {
...
  }
};

template <class NUM_TYPE> void test_filter_square_roots() {
...

    Extractor<Filtro<int>,Mapeador<std::string, int>> new_extrator(new_filtro, new_mapeador, saida);

我只是截取了一小部分代码让大家能够看懂,但是我的问题是声明了名为Extractor的模板的类,看看扩展的错误报告(我截取了一小部分错误) :

ExtratorDeDados.cpp:在“void test_filter_square_roots() [with NUM_TYPE = int]”的实例化中: ExtratorDeDados.cpp:329:37:从这里需要 ExtratorDeDados.cpp:243:61: 错误: 没有匹配函数调用 'ExtratorDeDadosMapeadorstd::__cxx11::basic_string >::ExtratorDeDados(Filtro&, Mapeador int>&, std::vector<:__cxx11::basic_string int> >&)' ExtratorDeDados> new_extrator(new_filtro, new_mapeador, >saida); ^~~~~~~~~~~~ 在 ExtratorDeDados.cpp:3:0 包含的文件中: ExtratorDeDados.hpp:124:5:注意:候选:ExtratorDeDados::ExtratorDeDados(std::vector&, >Filtro&, Mapeador&) [with O = Filtro; D = Mapeadorstd::__cxx11::basic_stringint>] ExtratorDeDados( ^~~~~~~~~~~~~~~ ExtratorDeDados.hpp:124:5: 注意:没有已知的参数 1 从‘Filtro’到>‘std::vector >&’的转换 ExtratorDeDados.hpp:113:35: 注意: 候选: constexpr ExtratorDeDadosMapeadorstd::__cxx11::basic_string >::ExtratorDeDados(const >ExtratorDeDados >&) 模板 class ExtratorDeDados { ^~~~~~~~~~~~~~~ ExtratorDeDados.hpp:113:35:注意:候选人需要 1 个参数,提供 3 个参数 ExtratorDeDados.hpp:113:35: 注意: 候选: constexpr ExtratorDeDadosMapeadorstd::__cxx11::basic_string >::ExtratorDeDados(ExtratorDeDadosMapeadorstd::__cxx11::basic_string >&&) ExtratorDeDados.hpp:113:35:注意:候选人需要 1 个参数,提供 3 个参数 ExtratorDeDados.cpp:在“void test_filter_square_roots() [with NUM_TYPE = double]”的实例化中: ExtratorDeDados.cpp:332:40:从这里需要 ExtratorDeDados.cpp:243:61: 错误: 没有匹配函数调用 'ExtratorDeDadosMapeadorstd::__cxx11::basic_string >::ExtratorDeDados(Filtro&, Mapeadorint>&, std::vector<:__cxx11::basic_string int> >&)' ExtratorDeDados> new_extrator(new_filtro, new_mapeador, >saida); ^~~~~~~~~~~~ 在 ExtratorDeDados.cpp:3:0 包含的文件中: ExtratorDeDados.hpp:124:5:注意:候选:ExtratorDeDados::ExtratorDeDados(std::vector&, >Filtro&, Mapeador&) [with O = Filtro; D = Mapeadorstd::__cxx11::basic_stringint>] ExtratorDeDados( ^~~~~~~~~~~~~~~ ExtratorDeDados.hpp:124:5: 注意:没有已知的参数 1 从‘Filtro’到>‘std::vector >&’的转换 ExtratorDeDados.hpp:113:35: 注意: 候选: constexpr ExtratorDeDados

【问题讨论】:

    标签: c++ oop c++11 inheritance multiple-inheritance


    【解决方案1】:

    这是你的声明:

    template <class O, class D> class Extractor{
      public:
        Extractor(
            std::vector<O>& input_data,
            Filtro<O>& filtro,
            Mapeador<O, D>& mapeador
        ): _input_data(input_data), _filtro(filtro), _mapeador(mapeador) {}
    

    来电:

        Extractor<Filtro<int>,Mapeador<std::string, int>> new_extrator(new_filtro, new_mapeador, saida);
    

    所以,O 是 Filtro&lt;int&gt;,D 是 Mapeador&lt;std::string, int&gt;。

    这意味着参数必须是:

        std::vector<Filtro<int>>& input_data,
        Filtro<Filtro<int>>& filtro,
        Mapeador<Filtro<int>, Mapeador<std::string, int>>& mapeador
    

    但是,作为std::vector&lt;O&gt;,您传递的是new_filtro,即Filtro&lt;int&gt;*,而不是Mapeador&lt;O, D&gt;,您传递的是new_mapeador,即Mapeador&lt;int, int&gt;*。

    因此参数与您声明的类型不匹配。

    【讨论】:

    • 对参数有点困惑,但你明白了要点
    • 嗯,我明白了你所做的,但这是一个大学项目,我无法更改 .hpp 文件
    • @FabricioLopes hpp 文件很好。不是你对它的使用。这正是您应该解决的问题:-)
    • 好的,非常感谢你
    • @FabricioLopes 你明白吗?有时像调用中的参数顺序这样简单的事情会产生大量错误消息。您必须将代码编程到 API,而不是更改 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多