typedef von typen innerhalb eine templateklasse
-
also bei dr. dobb´s hab ich das hier gefunden
void f( int ); // function template<typename T> void f( T ); // function template, usage f<int> class X { }; // class template<typename T> class X { }; // class template, usage X<int> typedef map<string, Employee> EmployeeRegistry; // typedef template<typename T> typedef map<string, T> Registry; // typedef template, // usage Registry<Employee>und ich dachte mir hey dann könnt doch auch dieses jene gehen
template< typename V, typename D, typename O > typedef RssdXmlProcessTree<V,D,O>::Ref_Type RssdXmlProcessTreeRef ;dann beglückte mich vs 2005 mit folgender meldung
Will automatically link with mlog_sd.1.4.0.vc8.lib
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : error C2823: a typedef template is illegal
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : warning C4346: 'rssd::RssdXmlProcessTree<V,D,O>::Ref_Type' : dependent name is not a type
prefix with 'typename' to indicate a type
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : error C2146: syntax error : missing ';' before identifier 'RssdXmlProcessTreeRef'
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : error C2888: 'RssdXmlProcessTree<V,D,O>::Ref_Type Ref_Type' : symbol cannot be defined within namespace 'rssd'
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : fatal error C1903: unable to recover from previous error(s); stopping compilationdann dachte hey versuchts es mal so:
template< typename V, typename D, typename O > typename typedef RssdXmlProcessTree<V,D,O>::Ref_Type RssdXmlProcessTreeRef ;dann wurde vs noch viel mitteilsamer
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(374) : error C2998: 'RssdXmlProcessTree<V,D,O>::Ref_Type rssd::RssdXmlProcessTreeRef' : cannot be a template definition
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(48) : error C2989: 'mlib::MString' : class template has already been declared as a non-class template
c:\projekte\development\realsim\mlib\code.1.4.0\mlib\mstring.h(59) : see declaration of 'mlib::MString'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(56) : error C2989: 'mlib::MXmlData' : class template has already been declared as a non-class template
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmldata.h(79) : see declaration of 'mlib::MXmlData'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : error C2989: 'mlib::MXmlTypeWrapper' : class template has already been declared as a non-class template
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlparameter.h(56) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(21) : error C2039: 'GetCardinality' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(22) : error C2270: 'GetCardinality' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(30) : error C2039: 'GetSize' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(31) : error C2270: 'GetSize' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(38) : error C2039: 'Resize' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(39) : error C2270: 'Resize' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(46) : error C2039: 'GetSubstructure' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(47) : error C2270: 'GetSubstructure' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(55) : error C2039: 'IsXmlSubDocString' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(56) : error C2270: 'IsXmlSubDocString' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(64) : error C2039: 'IsComplexElement' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(65) : error C2270: 'IsComplexElement' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(73) : error C2039: 'IsEqual' : is not a member of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(76) : error C2270: 'IsEqual' : modifiers not allowed on nonmember functions
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(77) : error C2673: 'IsEqual' : global functions do not have 'this' pointers
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.impl.h(77) : error C2027: use of undefined type 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmltypewrapper.h(271) : see declaration of 'mlib::MXmlTypeWrapper'
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlbasetypewrapper.h(82) : error C2504: 'mlib::MXmlTypeWrapper' : base class undefined
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlbasetypewrapper.h(236) : see reference to class template instantiation 'mlib::MXmlBaseTypeWrapper<T>' being compiled
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlbasetypewrapper.h(82) : error C2504: 'mlib::MXmlTypeWrapper' : base class undefined
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlenumwrapper.h(81) : see reference to class template instantiation 'mlib::MXmlBaseTypeWrapper<T>' being compiled
with
[
T=int
]
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlenumwrapper.impl.h(54) : error C2440: 'return' : cannot convert from 'mlib::MXmlEnumWrapper *' to 'mlib::MXmlTypeWrapper *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlbasetypewrapper.h(82) : error C2504: 'mlib::MXmlTypeWrapper' : base class undefined
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlboolwrapper.h(80) : see reference to class template instantiation 'mlib::MXmlBaseTypeWrapper<T>' being compiled
with
[
T=bool
]
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlboolwrapper.impl.h(61) : error C2065: 'mDescription' : undeclared identifier
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlboolwrapper.impl.h(70) : error C2440: 'return' : cannot convert from 'mlib::MXmlBoolWrapper *' to 'mlib::MXmlTypeWrapper *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlvectorwrapper.h(72) : error C2504: 'mlib::MXmlTypeWrapper' : base class undefined
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlvectorwrapper.h(280) : see reference to class template instantiation 'mlib::MXmlVectorWrapper<T>' being compiled
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlelementwrapper.h(70) : error C2504: 'mlib::MXmlTypeWrapper' : base class undefined
c:\projekte\development\realsim\mlib\code.1.4.0\mxml\mxmlelementwrapper.h(260) : see reference to class template instantiation 'mlib::MXmlElementWrapper<T>' being compiled
Will automatically link with rssdcommon_sd.1.4.0.vc8.lib
Will automatically link with mdata_sd.1.4.0.vc8.libok ich hab für meinen fall das problem anderweitig gelöst und über einen basistypen von dem die templateklasse erbt dann entsprechend nötige definitionen gemacht.
Aber warum gehts eigentlich nicht? nur so grundsätzlich. Liegt es daran dass ich auf einen internen typen einer noch nicht parametrisierten termplateklasse zugreifen möchte? oder hab ich einfach nenn fehler gemacht oder ist das vs 2005 einfach zu doof dazu?
achja hier der anfang vom header
template< typename V, typename D, typename O = mlib::MObserverRef > class RSSDSERVER_DLL_API RssdXmlProcessTree : public mlib::MXmlData, public mlib::MRefInterface< RssdXmlProcessTree< V, D, O > > { public:Dieser ::Ref_Type wird übrigens vom MRefInterface interface intern definiert

-
Hi,
Jason_Frost schrieb:
template< typename V, typename D, typename O > typename typedef RssdXmlProcessTree<V,D,O>::Ref_Type RssdXmlProcessTreeRef ;Auch mal so versucht

typedef typename RssdXmlProcessTree<V,D,O>::Ref_Type RssdXmlProcessTreeRef ;
-
template<typename T> typedef map<string, T> Registry;
Dies ist kein gültiger C++ Standard Code, da so etwas nicht direkt möglich ist.
Man muß sich dann mit einer Struktur/Klasse behelfen:template<typename T> struct X { typedef map<string, T> Registry; }; // Benutzung: X<int>::Registry reg;
-
Zusatz: Ab dem nächsten C++-Standard wir das wohl direkt über 'using' gehen.
-
KasF schrieb:
Auch mal so versucht

typedef typename RssdXmlProcessTree<V,D,O>::Ref_Type RssdXmlProcessTreeRef ;hatte auch einen riesigen berg an fehlern verursacht ^^
-
Dann schau dich nach einem neuen Compiler um oO
mit ERST typedef, dann typename ists nämlich vollkommen richitg.
Die Syntax lautet schließlich typedef AlterName NeuerName;und für template-interne Typen muss man das typename voranstellen (um klarzustellen dass es sich nicht um ein klassenmember handelt):
typename RssdXmlProcessTree<V,D,O>::Ref_Type
so dass alles zusammenkommt zu:
typedef // ja, jetzt kommt die neudefinition bzw. umbenamsung typename RssdXmlProcessTree<V,D,O>::Ref_Type // alter Typname RssdXmlProcessTreeRef; // neuer Typname, aber auch nicht viel hübscher, aber was solls/edit: erst typename und dann typedef wie du oben geschrieben hattest hat zu recht fehler verursacht...
-
also geht halt definitiv nicht mit meiner version von visual studio 2005
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(410) : error C2823: a typedef template is illegal
c:\projekte\development\realsim\rssd\code.1.4.0\rssdserver\rssdxmlprocesstree.h(410) : error C2998: 'RssdXmlProcessTree<V,D,O>::TreeObserverRefType rssd::RssdXmlProcessTreeRef' : cannot be a template definitionobriges sagt der compile bei diesen zeilen source code

[class RssdXmlProcessTree declaration ] } ; /* end class RssdXmlProcessTree */ template< typename V, typename D, typename O> typedef typename RssdXmlProcessTree<V, D, O>::Ref_Type RssdXmlProcessTreeRef ;diese definition befindet sich übrigens außerhalb der klasse, nicht innerhalb. nur um verwirrungen vorzubeugen

-
Ich würde sagen, dass du einfach nochmal diesen Thread hier lesen solltest. Hier wurde nämlich ganz klar gesagt, dass es keine template-typedefs gibt.
template< typename V, typename D, typename O> struct X { typedef typename RssdXmlProcessTree<V, D, O>::Ref_Type RssdXmlProcessTreeRef; };