Я пытаюсь скомпилировать следующий простой код на С++ с помощью Clang-3.5:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc:
#include "test.h"
A::A() {;}
A::~A() {;}
Команда, которую я использую для ее компиляции (Linux, uname -r: 3.16.0-4-amd64):
$clang-3.5 -Weverything -std=c++11 -c test.cc
И ошибка, которую я получаю:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Любые подсказки, почему это дает предупреждение? Виртуальный деструктор вообще не встроен. Напротив, существует внеуровневое определение, представленное в test.cc. Что мне здесь не хватает?
Изменить
Я не думаю, что этот вопрос является дубликатом:
В чем смысл clang -Wweak-vtables?
как предположил Филипп Розен. В моем вопросе я конкретно ссылаюсь на чистые абстрактные классы (не упомянутые в предлагаемом дубликате). Я знаю, как -Wweak-vtables
работает с не-абстрактными классами, и я в порядке с ним. В моем примере я определяю деструктор (который является чисто абстрактным) в файле реализации. Это должно помешать Clang испускать какие-либо ошибки даже при -Wweak-vtables
.