नीचे कुछ सी++ कोड है जो मेरे मैक (Xcode 10.2 10E125 / Apple LLVM संस्करण 10.0.1 (clang-1001.0.46.4)) पर त्रुटि के बिना संकलित करता है, लेकिन एक कंपाइलर-त्रुटि संदेश देता है (नीचे दिखाया गया है) मेरा लिनक्स बॉक्स (g++ (उबंटू 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609)।

मेरा सवाल है, क्या यह g++ 5.4.0 में एक कंपाइलर-बग है, या क्या मैं अपने कोड में कुछ गलत कर रहा हूं?

G++ 5.4.0 से संकलक त्रुटि है:

$ g++ template_friend.cpp
template_friend.cpp: In instantiation of ‘class SubClass<int>’:
template_friend.cpp:25:23:   required from here
template_friend.cpp:10:10: error: ‘class BaseClass<int>::InnerClassFunctor’ is private
    class InnerClassFunctor
          ^
template_friend.cpp:17:26: error: within this context
 template <class T> class SubClass : public BaseClass<typename BaseClass<T>::InnerClassFunctor >

... और त्रुटि को पुन: उत्पन्न करने के लिए कोड है:

template<class T> class BaseClass
{
public:
   BaseClass(int) {}

private:
   template<class HisT> friend class SubClass;

   class InnerClassFunctor
   {
   public:
      InnerClassFunctor() {}
   };
};

template <class T> class SubClass : public BaseClass<typename BaseClass<T>::InnerClassFunctor >
{
public:
   SubClass(int x) : BaseClass<typename BaseClass<T>::InnerClassFunctor >(x) {/* empty */}
};

int main(int, char **)
{
   SubClass<int> table(0);
   return 0;
}
4
Jeremy Friesner 21 अप्रैल 2019, 06:57

1 उत्तर

सबसे बढ़िया उत्तर

जबकि मानक इस मामले को स्पष्ट रूप से संबोधित नहीं करता है, मुझे लगता है कि यह एक जीसीसी बग है: न तो यह और न ही क्लैंग लागू करता है आस्थगित पहुंच जांच ठीक से, और जीसीसी को विशेष रूप से टेम्पलेट पैरामीटर (और, जाहिरा तौर पर, तर्क) के साथ समस्या है।

2
Davis Herring 21 अप्रैल 2019, 17:15