Проблема с переопределением метода (с использованием типов generi c) - PullRequest
0 голосов
/ 12 января 2020

Я получаю эту ошибку, когда пытаюсь переопределить функцию "Solver :: solve (P key)": enter image description here

Не виртуальная функция-член, отмеченная ' override 'скрывает функцию виртуального члена. скрытая перегруженная виртуальная функция 'Solver <, std :: vector>, std :: allocator >>>> :: solve', объявленная здесь: тип mimsatch ...

Solver.h:

...
template<class P, class S>
class Solver{
 public:
  virtual S solve(P key) = 0;
};

Bh

using namespace std;

namespace server_side {
class B: public Solver<string, vector<vector<double>>> {
 public:
  string solve(vector<vector<double>> mat) override {//<--- The error is here, on "override"
    code...
  }

Однако, если я заменю vector<vector<double>>> на std::string, все будет работать отлично. Проблема в том, что мне нужно, чтобы он был vector<vector<double>>> ...

Альтернативный код, который работает:

...
using namespace std;

namespace server_side {
class B: public Solver<string, string> {
 public:
  string solve(string mat) override {
    code...
  }

Есть идеи, как его решить? Спасибо!

1 Ответ

2 голосов
/ 12 января 2020

Вы наследуете от Solver<string, vector<vector<double>>>. P равно string, S равно vector<vector<double>>, и чисто виртуальная функция имеет следующую подпись

virtual vector<vector<double>> solve(string) = 0;

Вы пытаетесь переопределить ее с помощью

string solve(vector<vector<double>>);

Вам нужно что-то поменять.

Solver<string, string> работает, потому что P и S одинаковы, поэтому порядок не имеет значения.


Также обратите внимание, что взятие vector<vector<double>> mat по значению очень неэффективно для больших матриц. Если вам действительно не нужна копия, вы можете взять ее вместо const vector<vector<double>>&.

...