यहां एक अपरिभाषित विधि वाला एक वर्ग है। ऐसा लगता है compilers इतने लंबे समय के रूप में अपरिभाषित सदस्य समारोह कभी नहीं कहा जाता है, इस वर्ग के उदाहरण का निर्माण करने की अनुमति:क्या सभी अप्रयुक्त अपरिभाषित तरीकों की अनुमति है?
struct A {
void foo();
};
int main() {
A a; // <-- Works in both VC2013 and g++
a.foo(); // <-- Error in both VC2013 and g++
}
यहाँ एक ऐसी ही स्थिति है, लेकिन एक है कि विरासत शामिल है। सबक्लास Bar
बेस क्लास Foo
बढ़ाता है। Foo
एक विधि g()
परिभाषित करता है। Bar
समान नाम वाले विधि वाणी लेकिन यह परिभाषित नहीं करता:
#include <iostream>
struct Foo {
void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
void g();
};
int main() {
Bar b; // Works in both VC2013 and g++
b.Foo::g(); // Works in both VC2013 and g++
b.g(); // Error in both VC2013 and g++
}
यहाँ से ऊपर का एक परिवर्तन हो। यहां फर्क सिर्फ इतना है कि g()
Foo
और Bar
दोनों को virtual
है:
#include <iostream>
struct Foo {
virtual void g() { std::cout << "g\n"; }
};
struct Bar : Foo {
virtual void g();
};
int main() {
Bar b; // Works in g++. But not in VC2013, which gives
// 'fatal error LNK1120: 1 unresolved externals'
b.Foo::g(); // Works in g++, but VC2013 already failed on b's construction
b.g(); // Error in g++, but VC2013 already failed on b's construction
}
VC2013 और जी के बीच ++ अलग व्यवहार के विपरीत के लिए कोड टिप्पणी देखें।
- कौन सा कंपाइलर सही है, यदि कोई है?
- वीसी2013 के कंपाइलर के पास
virtual
कीवर्ड के साथ अपने संस्करण मेंvirtual
कीवर्ड के बिना किसी संस्करण की तुलना में कुछ अलग-अलग शिकायतें क्यों हैं? - अप्रयुक्त अपरिभाषित विधियों को हमेशा अनुमति दी जाती है? यदि नहीं, तो वे सभी मामले क्या हैं जिनमें वे की अनुमति नहीं है?
Bar
g()
की घोषणा ओवरराइडिंग के रूप में गिनती है, भले हीBar
परिभाषा प्रदान नहीं करता है?
vtable को कन्स्ट्रक्टर में संदर्भित किया गया है, और इसे वर्चुअल फ़ंक्शंस के पते की आवश्यकता है, इसलिए VC2013 की त्रुटि उचित लगती है। – BartoszKP