Sto cercando di compilare il codice seguente semplice C++ usando Clang-3.5:clang: no out-of-line definizioni virtuali metodo (puro estratto di classe C++)
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc:
#include "test.h"
A::A() {;}
A::~A() {;}
Il comando che uso per la compilazione di questo (Linux, uname -r: 3.16.0-4-amd64):
$clang-3.5 -Weverything -std=c++11 -c test.cc
E l'errore che ottengo:
./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]
Eventuali suggerimenti perché questo sta emettendo un avvertimento? Il distruttore virtuale non è affatto delineato. Al contrario, c'è una definizione out-of-line fornita in test.cc. Cosa mi manca qui?
Modifica
Non credo che questa domanda è un duplicato di: What is the meaning of clang's -Wweak-vtables? come Filip Roséen suggerito. Nella mia domanda faccio specifico riferimento alle classi astratte pure (non menzionate nel duplicato suggerito). So come -Wweak-vtables
funziona con classi non astratte e io sto bene con esso. Nel mio esempio definisco il distruttore (che è puro astratto) nel file di implementazione. Ciò dovrebbe impedire a Clang di emettere errori, anche con -Wweak-vtables
.
@ gha.st In effetti, ma che differenza non fa? Mi sono imbattuto in questo problema mentre implementavo una classe astratta più complessa, ma qui è irrilevante. Il codice sopra dovrebbe ancora andare bene, giusto? –
Non è questo l'esatto duplicato di [quest'altra domanda] (http://stackoverflow.com/q/28788353/2069064) che hai chiesto 3 ore dopo? – Barry
@Barry Penso che questa sia la migliore domanda dei due, quindi questa è la cosa che ho generico. L'altra domanda spiega che al momento di chiederlo, questo era chiuso come un dupe di un altro, ma in seguito fu riaperto. – Oktalist