Получение «неразрешенного внешнего символа» путем перезаписи виртуальной функции - PullRequest
0 голосов
/ 26 апреля 2018

Я написал простой интерфейс: (ICopyOnOperator.h)

template<typename T>
class ICopyOnOperator {

    public:
        virtual const T& operator=(const T& other) = 0;

        ICopyOnOperator() = default;

        ICopyOnOperator(const ICopyOnOperator& other) {
            this->operator=((const T&)other);
        }
};

Предполагается автоматизировать вызов функции operator=, когда вызывается конструктор копирования. В другом классе я получаю из этого: (Vao.h)

class Vao : public ICopyOnOperator<Vao> {
   ...

   public:
        virtual const Vao& operator=(const Vao& other) override {
            return *this;
        }
};

И когда я компилирую свой код, я получаю ошибку «неразрешенный внешний символ». У вас есть идея, почему (я знаю, что означает сообщение об ошибке, но почему это происходит?) Или как по-другому достичь моей цели?

[EDIT] * * +1010

Чтобы было понятно. Компоновщик не может найти метод ICopyOnOperator<class Vao>::operator=(class rhino::Vao const &). Полное сообщение об ошибке:

1> tester.obj: ошибка LNK2019: неразрешенный внешний символ «public: виртуальный класс rhino :: Vao const & __thiscall rhino :: ICopyOnOperator :: operator = (класс rhino :: Vao const &)» (?? 4? $ ICopyOnOperator @ VVao @ rhino @@@ rhino @@ UAEABVVao @ 1 @ ABV21 @@ Z) ссылка на функцию "public: __thiscall rhino :: ICopyOnOperator :: ICopyOnOperator (класс rhino :: ICopyOnOperator const &)" (?? 0? $ ICopyOnOperator @ VVao @ носорог @@@ носорог @@ QAE @ ABV01 @@ Z) * ​​1015 *

1 Ответ

0 голосов
/ 26 апреля 2018

Это связано с тем, что вы вызываете виртуальный метод (operator=) из конструктора. Вызов виртуального метода из конструктора приводит к вызову метода, определенного на этом уровне иерархии, а не метода, определенного в создаваемом классе.

См. Принятый ответ здесь: Вызов виртуальных функций внутри конструкторов

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