मैं का उपयोग कर निम्नलिखित सरल सी ++ कोड संकलित करने के लिए कोशिश कर रहा हूँ बजना-3.5:बजना: कोई आउट-ऑफ-लाइन आभासी विधि परिभाषाओं (शुद्ध सार सी ++ वर्ग)
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc:
#include "test.h"
A::A() {;}
A::~A() {;}
आदेश है कि मैं इस संकलन के लिए उपयोग (लिनक्स, 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 में प्रदान की गई एक बाहरी परिभाषा है। मुझे यहां क्या समझ नहीं आ रहा है?
संपादित
मुझे नहीं लगता कि इस सवाल का डुप्लिकेट है है: What is the meaning of clang's -Wweak-vtables? के रूप में फ़िलिप Roséen का सुझाव दिया। मेरे प्रश्न में मैं विशेष रूप से शुद्ध अमूर्त कक्षाओं का उल्लेख करता हूं (सुझाए गए डुप्लिकेट में उल्लिखित नहीं)। मुझे पता है कि -Wweak-vtables
गैर सार वर्गों के साथ काम करता है और मैं इसके साथ ठीक हूँ। मेरे उदाहरण में मैं कार्यान्वयन फ़ाइल में विनाशक (जो शुद्ध सार है) परिभाषित करता हूं। इससे क्लैंग को -Wweak-vtables
के साथ भी किसी भी त्रुटि को उत्सर्जित करने से रोका जाना चाहिए।
@ gha.st वास्तव में, लेकिन क्या अंतर नहीं करता है? एक जटिल परिसर वर्ग को लागू करते समय मैं इस समस्या में आया, लेकिन यह यहां अप्रासंगिक है। उपरोक्त कोड अभी भी ठीक होना चाहिए, है ना? –
क्या यह [यह अन्य प्रश्न] (http://stackoverflow.com/q/28788353/2069064) का सटीक डुप्ली नहीं है जिसे आपने 3 घंटे बाद पूछा था? – Barry
@ बैरी मुझे लगता है कि यह दोनों का बेहतर सवाल है, इसलिए यह वह है जिसे मैंने बाउंस किया था। दूसरा सवाल बताता है कि उस समय पूछने के समय, यह एक दूसरे के डुप्ली के रूप में बंद कर दिया गया था, लेकिन बाद में इसे फिर से खोल दिया गया। – Oktalist