Линкер не может разрешить символ в переопределенном производном шаблоне - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть базовый класс

template<typename T>
struct Counter {
    static int objects;

    virtual size_t getSize() = 0;
    ... //some other things
};

И производный класс (в том же файле):

template <typename T, int N>
struct A : Counter<A<T,N>>{
    T data[N];
    size_t getSize() override {  //override don't make error
        return 100;  //100 for testing purpose only
    }
};

и позже я использую

A<int,10> a1;

Когда я ' я пытаюсь скомпилировать, я получил ошибку компоновщика:

LNK2019 unresolved external symbol "public: virtual unsigned int __thiscall  Counter<struct A<int,10> >::getSize(void)" (?getSize@?$Counter@U?$A@H$09@@@@UAEIXZ) referenced in function "public: __thiscall Counter<struct A<int,10> >::Counter<struct A<int,10> >(void)" (??0?$Counter@U?$A@H$09@@@@QAE@XZ)    

1 Ответ

1 голос
/ 19 апреля 2020

Сообщение об ошибке компоновщика показывает, что вы пытаетесь вызвать getSize из счетчика. Это, вероятно, скрыто в ваших "// некоторых других вещах". Пожалуйста, добавьте этот код тоже, потому что, скорее всего, проблема здесь root.

На данный момент я могу сказать, что вы не можете вызывать чисто виртуальную функцию struct Counter в конструкторе struct Counter.

Допустим, класс / структура Y наследуется от класса / структуры X, когда вы создаете экземпляр объекта типа Y, что происходит так:

  1. первый конструктор X называется
  2. тогда конструктор Y называется

Когда происходит шаг 1), часть объекта, представляющая класс Y, еще не создана, поэтому ни один из его методов еще не предназначен для выполнения.

...