बजना में/LLVM 3.6.2, एक संकलन त्रुटि में निम्न कोड परिणाम जब std=c++11
साथ संकलन:क्या यह गैर-स्थैतिक सदस्य वर्ग टेम्पलेट के भीतर घनिष्ठ संरचना के 'आकार' गैर-स्थिर सदस्य प्राप्त करता है?
template <typename T=void>
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar<> b;
return b.baz();
}
कमांड लाइन मंगलाचरण:
$ clang++ -std=c++11 nonstatic.cpp -o nonstatic
nonstatic.cpp:12:28: error: invalid use of non-static data member 'array'
return sizeof(foo::array);
~~~~~^~~~~
nonstatic.cpp:20:14: note: in instantiation of member function
'bar<void>::baz' requested here
return b.baz();
अगर मैं bar
बदल होने के लिए अब एक टेम्पलेट,
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar b;
return b.baz();
}
तब कोड साफ़ रूप से संकलित करता है। ध्यान दें, जीसीसी 5.2.1 std=c++11
के तहत दोनों संस्करणों को स्वीकार करता है। इसके अलावा, array
को संलग्न क्लास टेम्पलेट बॉडी में ले जाना (लेकिन इसे टेम्पलेट के रूप में छोड़ना) इसके परिणामस्वरूप क्लैंग इसे स्वीकार कर रहा है।
मानक के साथ कौन सा व्यवहार सही है? क्या यह जीसीसी, क्लैंग, या दोनों में एक बग है?
(मैंने सीएफ-उपयोगकर्ताओं पर उसी question से पूछा, लेकिन अब तक कोई प्रतिक्रिया नहीं मिली है)।
एक clang ++ बग की तरह दिखता है। पुष्टि करने के लिए गुरु की प्रतीक्षा कर रहा है। – YSC
हां, निश्चित रूप से एक बग। – SergeyA
वर्कअराउंड 'sizeof (((foo *) 0) -> सरणी) 'http://stackoverflow.com/questions/29359661/clang-error-invalid-use-of-non-static-data- मेम्बर में उल्लिखित' यहाँ भी। –