ошибка C2664 при передаче производного объекта в функцию конструктора - PullRequest
0 голосов
/ 03 июня 2018

У меня есть 2 базовых класса.Первый содержит список функций обратного вызова:

    class BaseCallbacks {
     public:
       virtual void callback1() = 0;
       virtual void callback2() = 0;

       virtual ~BaseCallbacks(){};
    };

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

class BaseClass{
  public:
    BaseClass();

    void some_function();
};

Существует также внешний классэто позволяет мне взаимодействовать с другим приложением:

class InterfaceClass {
  public:
    InterfaceClass(int x, int y, BaseCallbacks &callbacks);
    virtual ~InterfaceClass(){};
};

Одна из специализированных версий моего производного класса будет выглядеть примерно так:

enum TYPE{TYPE1,TYPE2};

template<bool B, TYPE T>
class DerivedClass : public BaseClass, public BaseCallbacks
{
  public:
    DerivedClass(int a);

    virtual void callback1() override;
    virtual void callback2() override;
  };

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

int main()
{
    DerivedClass<true, TYPE::TYPE1> D1(666);

    auto interface_ptr = std::make_shared<InterfaceClass>(111, 222, &D1);
}

Компилятор Visual Studio говорит, что: «ошибка C2664:« InterfaceClass :: InterfaceClass (InterfaceClass &) »: невозможно преобразовать аргумент 3 из« DerivedClass »в« BaseCallbacks ».

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

Я подозреваю, что шаблоны и множественное наследование как-то связаны с этим.Ребята, не могли бы вы пролить свет на этот вопрос?Заранее спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Обратите внимание, что конструктор InterfaceClass принимает ссылку на BaseCallbacks:

InterfaceClass(int x, int y, BaseCallbacks &callbacks);

Но вы пытаетесь передать указатель на DerivedClass (преобразуемый в указатель на BaseCallbacks):

std::make_shared<InterfaceClass>(111, 222, &D1);

Итак, чтобы исправить это, передайте D1 сам, а не его адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...