2017-02-23 3 views
10

मैं निम्नलिखित कोड (कुछ कम से कम उदाहरण) संकलित करने के लिए कोशिश कर रहा हूँ है, test.cpp दायर:बजना: निजी बेस पर कास्ट नहीं कर सकते हैं, जबकि एक सार्वजनिक आभासी विरासत

#include <iostream> 
#include <memory> 

class Shared : public std::enable_shared_from_this<Shared>{ 
public: 
    int prea; 
}; 

class Widget : public virtual Shared{ 
    int a; 
public: 
    ~Widget(){ 
     a = 7; 
    } 
}; 

class Container : virtual public Widget{ 
}; 

class List : private Container, virtual public Widget{ 
public: 
    int c; 
}; 


int main(int argc, char** argv){ 
    auto c = std::make_shared<List>(); 
    c->c = 3; 

    std::cout << c->c << std::endl; 

    return 0; 
} 

clang++ का उपयोग करते हुए इस प्रकार है:

clang++ test.cpp -std=c++11 

और यह मुझे निम्न त्रुटि देता है:

/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/shared_ptr_base.h:1106:50: error: 
     cannot cast 'List' to its private base class 'const enable_shared_from_this<Shared>' 
      __enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr); 
                 ^

पूर्ण आउटपुट here देखें।

फिर, यदि मैं g ++ का उपयोग करके एक ही कोड संकलित करता हूं, तो कोई त्रुटि नहीं होती है और यह निष्पादन योग्य बनाती है। और मैं कहूंगा कि यह परिणाम मैं उम्मीद करता हूं। कोई विचार नहीं क्यों clang ++ कोड पसंद नहीं है।

तो सवाल यह है कि कौन सही है? clang++ या g++?

संपादित: भी छोटे उदाहरण पर पुनः प्रस्तुत किया जा सकता है:

#include <iostream> 
#include <memory> 

struct Shared : public std::enable_shared_from_this<Shared>{ 
}; 

struct Container : virtual public Shared{ 
}; 

struct List : private Container, virtual public Shared { 
}; 

int main(int argc, char** argv){ 
    auto c = std::make_shared<List>(); 
    return 0; 
} 
+0

मैं उत्सुक हूं, क्या आप इसे क्लैंग की मानक लाइब्रेरी से संकलित कर सकते हैं? जैसा कि आप देख सकते हैं, * nix सिस्टम पर डिफ़ॉल्ट रूप से clang gcc की मानक लाइब्रेरी का उपयोग करता है। शायद यह एक बग है जब क्लैंग जीसीसी के मानक पुस्तकालय कोड संकलित करता है। संपादित करें: मैंने इसे जल्दी से कोलिरु पर परीक्षण किया, ऐसा लगता है कि मानक लाइब्रेरी में कोई फर्क नहीं पड़ता है, लेकिन ओपी शायद आपको यह सत्यापित करना चाहिए। –

+1

बहुत छोटा रेपो केस (प्रश्न अपडेट करने पर विचार करें): http://coliru.stacked-crooked.com/a/56d44d6bf2ce459b –

+1

यह काम करता है यदि आप केवल 'वर्ग सूची: आभासी सार्वजनिक विजेट, निजी कंटेनर' का उपयोग करते हैं। – skypjack

उत्तर

0

मैं दोनों बजना-3.4.1 और बाद में, और जीसीसी-4.7.1 और बाद में इस के लिए समर्थन को देखते हैं। Example in Compiler explorer

संबंधित मुद्दे