2016-03-07 8 views
8

में स्थिर constexpr साथ नीचे मेरी सरल उदाहरण पर विचार करें। क्लैंग में, हालांकि, यह त्रुटि no member named 'x' in 'Derived' से संकलित करने में विफल रहता है। जहां तक ​​मैं यह कह सकता हूं कि यह सही कोड है। क्या मैं कर रहा हूं उसके साथ कुछ गड़बड़ है, और यदि नहीं, तो क्या इस काम को क्लैंग में रखने का कोई तरीका है?मजे की बात है आवर्ती टेम्पलेट पैटर्न (CRTP) बजना

+0

बहुत समान प्रश्न: http://stackoverflow.com/q/35759047/996886 – melak47

+0

यदि आप '' y' Base' के बाहर प्रारंभ एक आसान संभावित समाधान, मान के स्थान पर constexpr कार्यों का उपयोग करने के लिए है कक्षा क्या यह काम करती है? –

+0

@ बेन आप कक्षा के बाहर 'constexpr स्थिर int' intialize नहीं कर सकते हैं। – melak47

उत्तर

0

यह शायद इस सवाल का जवाब किसी के लिए देख रहा होगा नहीं है, लेकिन मैं एक तृतीय श्रेणी जोड़कर समस्या हल:

#include <iostream> 

template <typename T> 
class Base 
{ 
public: 
    static constexpr int y = T::x; 
}; 

class Data 
{ 
public: 
    static constexpr int x = 5; 
}; 

class Derived : public Base<Data>, public Data {}; 

int main() 
{ 
    std::cout << Derived::y << std::endl; 
} 

यह रूप में वांछित काम करता है, लेकिन दुर्भाग्य से यह वास्तव में लाभ नहीं है सीआरटीपी का!

1

टिप्पणियों में लिंक के रूप में, Initializing a static constexpr data member of the base class by using a static constexpr data member of the derived class बताता है कि क्लैंग व्यवहार सी ++ 14 तक मानक अनुरूप है। क्लैंग 3.9 से शुरू हो रहा है, आपका कोड -std=c++1z के साथ सफलतापूर्वक संकलित करता है।

#include <iostream> 

template <typename T> 
class Base 
{ 
public: 
    static constexpr int y() {return T::x();} 
}; 

class Derived : public Base<Derived> 
{ 
public: 
    static constexpr int x() {return 5;} 
}; 

int main() 
{ 
    std::cout << Derived::y() << std::endl; 
} 
संबंधित मुद्दे