📄 tem04.c
字号:
// { dg-do assemble }// 980827 bkoz// template parameter redeclaration bugs, part two:// template template params and expanded template non-type parms// 14.1 Template parameters// p 13// The scope of a template-parameter extens from its point of// declartion until the end of its template. In particular, a// template-parameter can be used in the declaration of subsequent// template-parameters and their default arguments. // 14.6.1 Locally declared names// p 4// A template-parameter shall not be redeclared within its scope// (including nested scopes). A template-parameter shall not have the// same name as the template name.// 14 // declared friend template (v3, template type parameters)template <class T4>// { dg-error "" } .*class Xfourteen {protected: T4 value;public: Xfourteen(T4 init): value(init) {} template <template <typename T4> class T5> // { dg-error "" } .* friend bool isequal (Xfourteen<int>& lhs, Xfourteen<int>& rhs);};// 15// nested template class (v3, template type parameters)template <class T6>// { dg-error "" } .*class Xfifteen {protected: T6 value;public: Xfifteen(T6 init): value(init) {} template <template <typename T6> class T7> class nested {// { dg-error "" } .* int value; public: nested(): value( int(0)) {} };};// 16// member templates (v3, template type parameters)template <class T8>// { dg-error "" } .*class Xsixteen {protected: T8 value;public: Xsixteen(T8 init): value(init) {} template <template <typename T8> class T9> int comp_ge(int test) {// { dg-error "" } .* int local_value; if (local_value > value) return local_value; else return value; }};// 17// declared friend template (v4, template type parameters on the class)template <typename T9> class tem_base {public: T9 value;};template <typename T10, template <typename T12> class C10>class Xseventeen {protected: C10<T10> value;public: Xseventeen(){} template <typename T12> // ok?? friend bool isequal (Xseventeen<T10, tem_base>& lhs, Xseventeen<T10, tem_base>& rhs);};//template class Xseventeen<int, tem_base>;// 18// more template template redecl teststemplate <typename T14, template <typename T15> class C12>// { dg-error "" } .*class Xeighteen {protected: C12<T14> value; // { dg-error "" } int C12; // { dg-error "" } .*};// 19// more template template redecl teststemplate <typename T16, template <typename T17> class C14>// { dg-error "" } .*class Xnineteen{protected: C14<T16> value; template <class C14> class nested {// { dg-error "" } .* T16 value; public: nested(): value( T16(0)) {} };};// 20// local names (14.6.1 p 4) part two, variable names as template paramtemplate <class T17, int i> struct Xtwenty { void f(){ T17 my_type; //ok for (int j = 0; j < 5; ++j) { T17 my_type; //ok ++my_type; } }};// 14.1 Template parameters// p 4// A non-type templat- parameter shall have one of the following// (optionally cv-qualified) types:// integral or enumeration type// pointer to object or pointer to function// referenct to object or referece to function// pointer to member// 21 // non-type template parameters v1: enumenum my_enum {my_A = 45, my_B, my_C};template <my_enum T18> class Xtwentyone {// { dg-error "" } .* float T18; // { dg-error "" } .*};// 22// non-type template parameters v1: pointer to objectstruct base { int gcount; int ret_gcount() {return gcount;}};template <class T20, base* b> class Xtwentytwo {// { dg-error "" } .* float b; // { dg-error "" } .*};// 23// non-type template parameters v2: reference to objecttemplate <class T20, base& b2> class Xtwentythree {// { dg-error "" } .* float b2; // { dg-error "" } .*};// 24// non-type template parameters v3: pointer to membertemplate <class T20, int base::* b3> class Xtwentyfour {// { dg-error "" } .* float b3; // { dg-error "" } .*};// 25// non-type template parms that use push_class_leveltemplate <class T22> void f1() {// { dg-error "" } .* struct foo { enum T22 { un, du, toi }; // { dg-error "" } .* };}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -