मैं एक छोटा सा पुस्तकालय है कि सी ++ 11 metaprogramming तकनीकों और CRTP का एक बहुत का उपयोग लिखा है संकलित करने के लिए असफल हो, और यह जी ++ 4.7.2बजना और इंटेल इस CRTP कोड
अब साथ अच्छी तरह से संकलित, मैं करने की कोशिश इसे इंटेल आईसीपीसी 13.0.0.079 के साथ संकलित करें और यह कई सैकड़ों त्रुटियों को उत्पन्न करता है। तो मैं एक के बाद समस्याओं को अलग करने की कोशिश करता हूं।
test_crtp.cpp(26): error: type "Derived<Type>::Derived" is not a class template
Derived(): Base<Derived, Type>() {;}
^
test_crtp.cpp(26): error: "Base" is not a nonstatic data member or base class of class "Derived<int>"
Derived(): Base<Derived, Type>() {;}
^
detected during instantiation of "Derived<Type>::Derived() [with Type=int]" at line 31
compilation aborted for test_crtp.cpp (code 2)
तो यह एक है:
तो, पहले, इस कोड, कि जी ++ 4.7.2
#include <iostream>
template<template<typename> class Crtp, typename Type>
struct Base {};
template<typename Type>
struct Derived : public Base<Derived, Type>
{
Derived(): Base<Derived, Type>() {;}
};
int main()
{
Derived<int> x;
return 0;
}
दोनों icpc और बजना के तहत कोई समस्या नहीं के साथ संकलित असफल इस कोड को संकलित करने के लिए पर विचार इंटेल और क्लैंग में बग, या जी ++ में? यदि यह इंटेल और क्लैंग में है, तो क्या आपको लगता है कि इसे भविष्य के संस्करण में हल किया जाएगा?
यह एक अच्छा सवाल है, लेकिन आमतौर पर सीआरटीपी टेम्पलेट-टेम्पलेट पैरामीटर से परेशान नहीं होता है, लेकिन केवल व्युत्पन्न वर्ग प्रकार को पास करता है। 'टेम्पलेट <टाइपनाम नामित> संरचना आधार; टेम्पलेट संरचना व्युत्पन्न: बेस < Derived> {...}; 'अधिक सामान्य है। –
... यदि आप 'टाइप' का प्रचार करना चाहते हैं, तो हो सकता है कि आप 'व्युत्पन्न' में 'टाइपपीफ' हो सकें जो इसे उजागर करता है ... – Nim
पहचानकर्ता 'व्युत्पन्न' नाम, अपनी कक्षा के भीतर, पूर्ण प्रकार 'व्युत्पन्न '।इसे * इंजेक्शन * क्लास नाम कहा जाता है। मुझे लगता है कि यह जीसीसी के साथ एक बग है। –
Xeo