не предоставлено подходящего определения для явного запроса на создание экземпляра шаблона - PullRequest
0 голосов
/ 26 мая 2018

У меня есть класс Calculator<T> и класс LoggingCalculator<T>, который наследуется от Calculator<T>.Calculator<T> имеет виртуальные методы, такие как add, multiply и т. Д. В дочернем классе LoggingCalculator<T> я пытаюсь переопределить эти методы.Я уже переопределил метод add, хорошо.Но я не могу переопределить multiply, потому что компилятор говорит:

Calculator :: Calculator [int] :: Calculator (void) ': нет подходящего определения для явного запроса на создание экземпляра шаблона

хотя я явно создал свои шаблоны.Я действительно не понимаю, , почему эта ошибка возникает при переопределении multiply метода, в то время как add прекрасно компилирует .

Действительно странная вещь в том, что делает скомпилируйте, если я не верну универсальное значение, возвращаемое методом базового класса.Но если вы хотите вернуть результат из метода базового класса, он не компилируется.См. LoggingCalculator.cpp код ниже.

Calculator.h:

template <class T>
class Calculator
{
public:
    Calculator();
    ~Calculator();
    virtual T add(T a, T b);
    virtual T multiply(T a, T b);
}
template class Calculator<int>;
template class Calculator<long>;
template class Calculator<float>;
template class Calculator<double>;

Calculator.cpp:

template<class T>
Calculator<T>::Calculator() {}

template<class T>
Calculator<T>::~Calculator() {}

template<class T>
T Calculator<T>::add(T a, T b)
{
    return a + b;
}

template<class T>
T Calculator<T>::multiply(T a, T b)
{
    return a * b;
}

LoggingCalculator.h:

template <class T>
class LoggingCalculator : public Calculator<T>
{
public:
    LoggingCalculator();
    ~LoggingCalculator();
    T add(T a, T b) override;
    T multiply(T a, T b) override;
};

template class LoggingCalculator<int>;
template class LoggingCalculator<long>;
template class LoggingCalculator<float>;
template class LoggingCalculator<double>;

LoggingCalculator.cpp:

template<class T>
LoggingCalculator<T>::LoggingCalculator() { }

template<class T>
LoggingCalculator<T>::~LoggingCalculator() {}

template<class T>
T LoggingCalculator<T>::add(T a, T b)
{
    T result = Calculator<T>::add(a, b);
    return result;
}

template<class T>
T LoggingCalculator<T>::multiply(T a, T b)
{
    T result =  Calculator<T>::multiply(a, b);
    //return a * b; // COMPILES FINE!
    return result // CAUSES ERROR
}

1 Ответ

0 голосов
/ 26 мая 2018

Вы должны будете переместить явные экземпляры в их соответствующие исходные файлы.Это потому, что определения того, что вы создаете, должны быть доступны в момент создания.

То, что вы делаете сейчас, создает экземпляр определения класса Calculator<int> и вместе с ним, объявление из Calculator<int>::add, но оно не создает экземпляр определения из Calculator<int>::add, потому что определение недоступно.

И так как явная реализация шаблонаопределение, как правило, оно не должно появляться в заголовочном файле в любом случае - это, вероятно, приведет к возникновению проблем с несколькими определениями.

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