Я получаю предупреждение компилятора, которого я не понимаю в этом контексте.Когда я компилирую «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;
}
Предупреждение
Класс "Child" является производным от "AbstractClass".В «AbstractClass» есть открытый метод «AbstractClass :: Cancel ()».Если я определяю метод вне тела класса (как в коде, который вы видите), я получаю предупреждение компилятора ...
AbstractClass.h (7): предупреждение C4505: 'AbstractClass ::Отмена ': локальная функция без ссылки была удалена с помощью [T = int]
... при компиляции "Child.cpp".Я не понимаю этого, потому что это публичная функция, и компилятор не может знать, буду ли я позже ссылаться на этот метод или нет.И, в конце концов, я ссылаюсь на этот метод, потому что я вызываю его в main.cpp и, несмотря на это предупреждение компилятора, этот метод работает, если я компилирую и связываю все файлы и запускаю программу:
//main.cpp
#include <iostream>
#include "Child.h"
int main()
{
Child child;
child.Cancel(); // Works, despite the warning
}
ЕслиЯ определяю функцию Cancel () как встроенную (вы видите ее как закомментированный код в 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;
}
Мне помогли ответы, которые я знаю, но я не думаю, что на этот вопрос дан полный ответ.