template <class T> class 2DArray { public: // 1D ARRAY CLASS class 1DArray { public: 1DArray() { Create(); } 1DArray(iterator arr) : array1d_(arr) { } explicit 1DArray(size_type cols,const T& t = T()) { Create(cols,t); } 1DArray(const 1DArray& arr) { Create(arr.begin(),arr.end()); } 1DArray& operator=(const 2DArray&); ~1DArray() { Uncreate(); } T& operator[](size_type n) { return array1d_[n]; } const T& operator[](size_type n) const { return array1d_[n]; } }
解决方法
>它不能从数字开始
>可以由字母,数字,下划线,通用字符名称1和实现定义的字符组成
>不能是keyword.
C++ draft standard中涵盖的部分是2.11包含以下语法的标识符:
identifier: identifier-nondigit <- Can only start with a non-digit identifier identifier-nondigit <- Next two rules allows for subsequent identifier digit <- characters to be those outlined in 2 above identifier-nondigit: nondigit <- a-z,A-Z and _ universal-character-name other implementation-defined characters [...]
和2.12关键字解释了保留用作关键字的所有标识符.
最后,还保留以下名称:
>包含双下划线__的名称,或以任何范围内的下划线后跟大写字母(如_Apple)开头,
>以全局命名空间中的下划线开头的名称(如全局命名空间中的_apple)保留.
标准草案中介绍的部分是17.6.4.3.2.我们可以找到一个理由,为什么这些保留从Rationale for International Standard—Programming Languages—C说:
[…]This gives a name space for writing the numerous behind-the-scenes non-external macros and functions a library needs to do its job properly[…]
在C这也适用于name mangling这个example显示.
脚注
>允许通用字符
允许的通用字符见附件E.1:
E.1 Ranges of characters allowed [charname.allowed]
00A8,00AA,00AD,
00AF,00B2-00B5,00B7-00BA,00BC-00BE,00C0-00D6,00D8-00F6,00F8-00FF
0100-167F,1681-180D,180F-1FFF 200B-200D,202A-202E,203F-2040,2054,
2060-206F 2070-218F,2460-24FF,2776-2793,2C00-2DFF,2E80-2FFF
3004-3007,3021-302F,3031-303F
3040-D7FF F900-FD3D,FD40-FDCF,
FDF0-FE44,FE47-FFFD
10000-1FFFD,20000-2FFFD,30000-3FFFD,40000-4FFFD,50000-5FFFD,60000-6FFFD,70000-7FFFD,80000-8FFFD,90000-9FFFD,A0000-AFFFD,B0000-BFFFD,C0000-CFFFD,D0000-DFFFD,E0000-EFFFD