Я получаю предупреждение компилятора, которого я не понимаю в этом контексте. Когда я компилирую "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 () как встроенную (вы видите ее как закомментированный код в 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;
}
Мне помогли известные ответы, но я не думаю, что на этот вопрос есть полный ответ.
Cancel()какinline, оставив его вне определения класса? - person sbk   schedule 16.06.2010