Я получаю предупреждение о компиляторе, которое я не понимаю в этом контексте. Когда я компилирую "Child.cpp" из следующего кода. (Не удивляйтесь: я отключил объявления классов до минимума, поэтому контент не будет иметь большого смысла, но вы увидите проблему быстрее). Я получаю предупреждение с Visual Studio 2003 и Visual Studio , 2008 на самом высоком уровне предупреждения.
Код
AbstractClass.h:
#include <iostream>
template<typename T>
class AbstractClass
{
public:
virtual void Cancel(); // { std::cout << "Abstract Cancel" << std::endl; };
virtual void Process() = 0;
};
// Outside definition. If I comment out this and take the inline
// definition like above (currently commented out), I don't get
// a compiler warning.
template<typename T>
void AbstractClass<T>::Cancel()
{
std::cout << "Abstract Cancel" << std::endl;
}
Child.h:
#include "AbstractClass.h"
class Child : public AbstractClass<int>
{
public:
virtual void Process();
};
Child.cpp:
#include "Child.h"
#include <iostream>
void Child::Process()
{
std::cout << "Process" << std::endl;
}
Предупреждение
Класс "Ребенок" происходит от "AbstractClass". В "AbstractClass" есть публичный метод "AbstractClass:: Cancel()". Если я определяю метод вне тела класса (как в коде, который вы видите), я получаю предупреждение компилятора...
AbstractClass.h(7): предупреждение C4505: "AbstractClass:: Cancel": удаленная локальная функция удалена с [T = int]
... когда я компилирую "Child.cpp". Я не понимаю этого, потому что это публичная функция, и компилятор не может знать, ссылаюсь ли позже на этот метод или нет. И, в конце концов, я ссылаюсь на этот метод, потому что я вызываю его в main.cpp и, несмотря на это предупреждение компилятора, этот метод работает, если я компилирую и связываю все файлы и выполняю программу:
//main.cpp
#include <iostream>
#include "Child.h"
int main()
{
Child child;
child.Cancel(); // Works, despite the warning
}
Если я определяю функцию Cancel() как inline (вы видите это как внекомандовый код в AbstractClass.h), то я не получаю предупреждение компилятора. Конечно, моя программа работает, но я хочу понять это предупреждение или это просто ошибка компилятора?
Кроме того, если вы не реализуете AbsctractClass как класс шаблона (просто для цели тестирования в этом случае), я также не получаю предупреждение о компиляторе...?
Если я создаю не виртуальную функцию, я не получаю предупреждение компиляции для этой не виртуальной функции, но все ответы до сих пор не включают в себя виртуальные вещи. Попробуйте следующее:
template<typename T>
class AbstractClass
{
public:
virtual void Cancel(); // { std::cout << "Abstract Cancel" << std::endl; };
virtual void Process() = 0;
void NonVirtualFunction();
};
//...
template<typename T>
void AbstractClass<T>::NonVirtualFunction()
{
std::cout << "NonVirtualFunction" << std::endl;
}
Ответы на вопросы помогли мне, но я не думаю, что на этот вопрос будет дан ответ.